二叉排序树与平衡二叉树的实现课程设计

二叉排序树与平衡二叉树的实现课程设计
二叉排序树与平衡二叉树的实现课程设计

攀枝花学院本科学生课程设计任务书题目二叉排序树与平衡二叉树的实现

1、课程设计的目的

1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操

作实现算法,以及它们在程序中的使用方法。

2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。

3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。

2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)

1) (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;

(2)对二叉排序树T作中序遍历,输出结果;

(3)计算二叉排序树T查找成功的平均查找长度,输出结果;

(4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行

操作2);否则输出信息“无x”;

(5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT

不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT;

(6)计算平衡的二叉排序树BT的平均查找长度,输出结果。

3、主要参考文献

[1]刘大有等,《数据结构》(C语言版),高等教育出版社

[2]严蔚敏等,《数据结构》(C语言版),清华大学出版社

[3]William Ford,William Topp,《Data Structure with C++》清华大学出版社

[4]苏仕华等,数据结构课程设计,机械工业出版社

4、课程设计工作进度计划

第1天完成方案设计与程序框图

第2、3天编写程序代码

第4天程序调试分析和结果

第5天课程设计报告和总结

指导教师(签字)日期年月日

教研室意见:

年月日学生(签字):

接受任务时间:年月日注:任务书由指导教师填写。

课程设计(论文)指导教师成绩评定表题目名称二叉排序树与平衡二叉树的实现

评分项目分

评价内涵

工作表现20% 01 学习态度 6 遵守各项纪律,工作刻苦努力,具有良好的科学

工作态度。

02 科学实践、调研7 通过实验、试验、查阅文献、深入生产实践等渠

道获取与课程设计有关的材料。

03 课题工作量7 按期圆满完成规定的任务,工作量饱满。

能力水平35% 04 综合运用知识的能力10

能运用所学知识和技能去发现与解决实际问题,

能正确处理实验数据,能对课题进行理论分析,

得出有价值的结论。

05 应用文献的能力 5

能独立查阅相关文献和从事其他调研;能提出并

较好地论述课题的实施方案;有收集、加工各种

信息及获取新知识的能力。

06

设计(实验)能力,方案

的设计能力

5

能正确设计实验方案,独立进行装置安装、调试、

操作等实验工作,数据正确、可靠;研究思路清

晰、完整。

07 计算及计算机应用能力 5 具有较强的数据运算与处理能力;能运用计算机

进行资料搜集、加工、处理和辅助设计等。

08

对计算或实验结果的分析

能力(综合分析能力、技

术经济分析能力)

10 具有较强的数据收集、分析、处理、综合的能力。

成果质量45% 09

插图(或图纸)质量、篇

幅、设计(论文)规范化

程度

5 符合本专业相关规范或规定要求;规范化符合本

文件第五条要求。

10 设计说明书(论文)质量30 综述简练完整,有见解;立论正确,论述充分,

结论严谨合理;实验正确,分析处理科学。

11 创新10 对前人工作有改进或突破,或有独特见解。

成绩

指导教师签名:年月日

摘要及关键字

本程序中的数据采用“树形结构”作为其数据结构。具体采用的是“二叉排序树”。

二叉排序树(又称二叉查找树):(1)若左子树不空,则左子树上所有节点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有节点均大于它的根结点的值;(3)它的左右子树分别为二叉排序树。

二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。

本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果;

(4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”;(5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。

关键字:数列L,结点,二叉排序树,平衡二叉树

目录

摘要 (3)

1 绪论 (5)

1.1 课程设计的目的 (5)

1.2 相关知识的阐述 (5)

1.2.1一位数组的存储结构 (5)

1.2.2建立二叉排序树 (5)

1.2.3中序遍历二叉树 (5)

1.2.4平均查找长度 (6)

1.2.5平均二叉树(AVL树) (6)

1.2.6平衡因子 (7)

1.2.7平衡二叉树的调整方法 (7)

2方案设计 (8)

2.1 模块功能 (8)

3 算法设计 (8)

3.1 算法流程图 (8)

4详细设计 (10)

4.1 主程序 (10)

4.2 定义二叉树结构 (11)

4.3 建立二叉树 (11)

4.3.1二叉排序树的查找 (11)

4.3.2二叉排序树的插入 (11)

4.4 中序遍历 (12)

4.5 平均查找长度 (12)

4.6 删除节点 (12)

4.7 判断平衡二叉树 (13)

5 调试分析 (14)

5.1 时间复杂度的分析 (14)

5.2 运行结果 (14)

5.3 结果分析 (15)

6 课程设计总结 (16)

参考文献 (17)

1 绪论

1.1 课程设计的目的

(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。

(2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。

(3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设

计的基本能力。

1.2 相关知识的阐述

1.2.1 一维数组的存储结构

建立二插排序树,首先用一个一维数组记录下读入的数据,然后再用边查找边插入的方式将数据一一对应放在完全二叉树相应的位置,为空的树结点用“0”补齐。

1.2.2 建立二叉排序树

二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行

插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时

查找路径上访问的最后一个结点的左孩子或右孩子结点。

插入算法:

首先执行查找算法,找出被插结点的父亲结点;

判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点

插入;

若二叉树为空,则首先单独生成根结点。

注意:新插入的结点总是叶子结点。

1.2.3 中序遍历二叉树

中序遍历二叉树算法的框架是:

若二叉树为空,则空操作;

否则(1)中序遍历左子树(L);

(2)访问根结点(V);

(3)中序遍历右子树(R)。

中序遍历二叉树也采用递归函数的方式,先访问左子树2i,然后访问根结点i,最后访问右子树2i+1.先向左走到底再层层返回,直至所有的结点都被访问完毕。

1.2.4 平均查找长度

计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。

假设在含有n(n>=1)个关键字的序列中,i个关键字小于第一个关键字,

n-i-1个关键字大于第一个关键字,则由此构造而得的二叉排序树在n个记录的查找概率相等的情况下,其平均查找长度为:

ASL(n,i)=[1+i*(P(i)+1)+(n-i-1)(P(n-i-1)+1)]/n 其中P(i)为含有i个结点的二叉排序树的平均查找长度,则P(i)+1为查找左子树中每个关键字时所用比较次数的平均值,P(n-i-1)+1为查找右子树中每个关键字时所用比较次数的平均值。又假设表中n个关键字的排列是“随机”的,即任一个关键字在序列中将是第1个,或第2个,…,或第n个的概率相同,则可对上式从i等于0至n-1取平均值。最终会推导出:

当n>=2时,ASL(n)<=2(1+1/n)ln(n)

由此可见,在随机的情况下,二叉排序树的平均查找长度和log(n)是等数量级的。

另外,含有n个结点的二叉排序树其判定树不是惟一的。对于含有同样一组结点的表,由于结点插入的先后次序不同,所构成的二叉排序树的形态和深度也可能不同。

而在二叉排序树上进行查找时的平均查找长度和二叉树的形态有关:

①在最坏情况下,二叉排序树是通过把一个有序表的n个结点依次插入而生

成的,此时所得的二叉排序树蜕化为棵深度为n的单支树,它的平均查找长度和

单链表上的顺序查找相同,亦是(n+1)/2。

②在最好情况下,二叉排序树在生成的过程中,树的形态比较匀称,最终得

到的是一棵形态与二分查找的判定树相似的二叉排序树,此时它的平均查找长度

大约是lgn。

③插入、删除和查找算法的时间复杂度均为O(lgn)。

1.2.5 平衡二叉树( AVL树 )

①平衡二叉树(Balanced Binary Tree)是指树中任一结点的左右子树的高

度大致相同。

②任一结点的左右子树的高度均相同(如满二叉树),则二叉树是完全

平衡的。通常,只要二叉树的高度为O(1gn),就可看作是平衡的。

③平衡的二叉排序树指满足BST性质的平衡二叉树。

④AVL树中任一结点的左、右子树的高度之差的绝对值不超过1。在最坏情况下,n个结点的AVL树的高度约为1.44lgn。而完全平衡的二叉树高度约为lgn,AVL树是最接近最优的。

1.2.6 平衡因子

二叉树上任一结点的左子树深度减去右子树的深度称为该结点的平衡因子,易知平衡二叉树中所有结点的因子只可能为0,-1和1。

平衡二叉排序树的在平衡因子绝对值等于2时开始调整到绝对值为1或0,在平衡因子绝对值为2时,二叉排序树会出现四种不同的情况的树形,因此这时需要分别单独讨论来降低平衡因子。

1.2.7 平衡二叉树的调整方法

平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤如下:

(1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点;

(2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;

(3)判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整;

(4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;

(5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。

2 方案设计

2.1 模块功能

1.建立二叉树:要求以回车('\n')为输入结束标志,输入数列L ,生成一棵二叉排序树T 。

2.中序遍历并输出结果:要求将第一步建立的二叉树进行中序遍历,并将结果输出。

3.平均查找长度并输出:要求计算二叉排序树T 查找成功的平均查找长度,输出结果。

4.删除节点:要求输入元素x,查找二叉排序树T,若存在含x 的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x ”。

5.生成平衡二叉树:要求用数列L ,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT 不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT ;

6.平均查找长度:计算平衡的二叉排序树BT 的平均查找长度,输出结果。

3 算法设计

3.1 算法流程图

建立二叉树流程图:

YES

NO

开始

输入数组以回车结束

遍历数组,判断是否为‘0’

调用查找、插入函数创建二叉树

创建二叉树结束

主程序流程图:

中序遍历流程图: 删除节点流程图:

输入需要删

除的节点 判断是否存在该节点 删除节点

未找到该节点,退出

否 否

创建二叉排序树

Switch(1)

中序遍历

Switch(0)

Exit(0)退出

Switch(3) 删除结点

Switch(2)

default

提示出错

计算平均查找长度

开始 调用遍历函数。利用递归算法,输出中序遍历结果 遍历结束

4 详细设计

4.1 主程序

void main()

{

node T=NULL;

int num;

int s=0,j=0,i=0;

int ch=0;

node p=NULL;

printf("请输入一组数字并输入0为结束符:");

do{

scanf("%d",&num);

if(!num) printf("你成功完成了输入!\n");

else insertBST(&T,num);

}while(num);

printf("\n\n---操作菜单---\n");

printf("\n 0: 退出" );

printf("\n 1: 中序遍历");

printf("\n 2: 平均查找长度");

printf("\n 3: 删除");

printf("\n 4: 判断是否是平衡二叉树");

while(ch==ch)

{

printf("\n 选择操作并继续:");

scanf("%d",&ch);

switch(ch){

case 0: exit(0); /*0--退出*/

case 1: printf(" 中序遍历结果是:\n ");

inorderTraverse(&T);

break;

case 2: s=0;j=0;i=0;

calculateASL(&T,&s,&j,i);

printf(" ASL=%d/%d",s,j);

break;

case 3: printf(" 请输入你想删除的数字:");

scanf("%d",&num);

if(searchBST(T,num,NULL,&p))

{

T=Delete(T,num);

printf(" 你已成功删除该数字!\n ");

inorderTraverse(&T);

else printf(" 没有你想要删除的节点%d!",num);

break;

case 4: i=0;

balanceBST(T,&i);

if(i==0) printf(" OK!这是平衡二叉树!");

else printf(" NO!");

break;

default: printf("你的输入有误!请重新输入!\n");

break;

}

}

}

4.2 定义二叉树结构

#include

typedef struct Tnode

{

int data;

struct Tnode *lchild,*rchild;

}*node,BSTnode;

4.3 建立二叉树

4.3.1 二叉排序树的查找

searchBST(node t,int key,node f,node *p){

/*在根指针t所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找成功,则指针p指向该数据元素节点,并返回(1),否则指针p指向查找路径上访问的最后一个节点并返回(0),指针f指向t的双亲,其初始调用值为NULL*/ if(!t) {*p=f;return (0);} /*查找不成功*/

else if(key==t->data) {*p=t;return (1);} /*查找成功*/

else if(keydata) searchBST(t->lchild,key,t,p); /*在左子树中继续查找*/

else searchBST(t->rchild,key,t,p); /*在右子树中继续查找*/

}

4.3.2 二叉排序树的插入

insertBST(node *t,int key){

/*当二叉排序树t中不存在关键字等于key的数据元素时,插入key并返回(1),否则返回(0)*/

node p=NULL,s=NULL;

if(!searchBST(*t,key,NULL,&p)) /*查找不成功*/

{ s=(node)malloc(sizeof(BSTnode));

s->data=key;

s->lchild=s->rchild=NULL;

if(!p) *t=s; /*被插入节点*s为新的根节点*/

else if(keydata) p->lchild=s; /*被插节点*s为左孩子*/

else p->rchild=s; /*被插节点*s为右孩子*/

return (1); }

else return (0); /*树中已有关键字相同的节点,不再插入*/

}

4.4 中序遍历

inorderTraverse(node *t) /*中序遍历*/

{ if(*t){

if(inorderTraverse(&(*t)->lchild))

{ printf("%d ",(*t)->data);

if(inorderTraverse(&(*t)->rchild)); }

} else return(1);

}

4.5 平均查找长度

calculateASL(node *t,int *s,int *j,int i) /*计算平均查找长度*/

{if(*t){ i++; *s=*s+i;

if(calculateASL(&(*t)->lchild,s,j,i))

{ (*j)++;

if(calculateASL(&(*t)->rchild,s,j,i))

{i--; return(1);}

}

} else return(1);

}

4.6 删除节点

node Delete(node t,int key)

{ /*若二叉排序树t中存在关键字等于key的数据元素时,则删除该数据元素节点*/

node p=t,q=NULL,s,f;

while(p!=NULL)

{ if(p->data==key) break;

q=p;

if(p->data>key) p=p->lchild;

else p=p->rchild;

}

if(p==NULL) return t;

if(p->lchild==NULL)

{ if(q==NULL) t=p->rchild;

else if(q->lchild==p) q->lchild=p->rchild;

else q->rchild=p->rchild;

free(p);

}

else{ f=p;

s=p->lchild;

while(s->rchild)

{ f=s;

s=s->rchild; }

if(f==p) f->lchild=s->lchild;

else f->rchild=s->lchild;

p->data=s->data;

free (s);

} return t;

}

4.7 判断平衡二叉树

int balanceBST(node t,int *i) /*判断平衡二叉树*/

{ int dep1,dep2;

if(!t) return(0);

else { dep1=balanceBST(t->lchild,i);

dep2=balanceBST(t->rchild,i);

}

if((dep1-dep2)>1||(dep1-dep2)<-1) *i=dep1-dep2;

if(dep1>dep2) return(dep1+1);

else return(dep2+1); }

5 调试分析

5.1 时间复杂度的分析

为了保证二叉排序树的高度为lgn,从而保证然二叉排序树上实现的插入、删除和查找等基本操作的时间复杂度为O(lgn)。

5.2 运行结果

图5.1.1 调试界面

在程序调试过程当中,编译时并没有报错,但是运行时总是出错,在查阅资料和同学的帮助下,发现程序未对数组初始化。添加数组初始化代码:

s=(node)malloc(sizeof(BSTnode))

输入一组数列,以结0结束:

图5.2.2运行界面一

中序遍历:

图5.2.3运行界面二

计算平均查找长度

图5.2.4运行界面三

删除已有结点:

图5.2.5运行界面四

删除失败:

图5.2.6运行界面五

判断是否是平衡二叉树:

图5.2.7运行界面六

5.3 结果分析

通过运行程序和严密的求证,运行结果无误,不过对于转换平衡二叉树和平衡二叉树平均查找长度未能实现,同时也无法实现图像显示。

6 课程设计总结

在这一周的课程设计中,其实对我来说还是收获颇多。这不光提高了我的程序设计能力,更为我的就业增加了筹码。对我们来说,独立完成这样课程设计是比较困难,其中包括模块的组成分析和模块功能的实现。最后我不得不从网上下载源程序,借助课本,困难地将几个模块串起来。最后终于完成了自己的课程设计。

这次实验中我也出现过一些比较严重的错误。在用一维数组顺序表结构编写程序时我错误的运用静态链表来实现函数功能。这是我对基本概念理解的模糊不清造成的。我原以为只要采用一维数组作为存储结构它就一定也是顺序表结构,而实质上这根本是两个不相干的概念。后来在同学的指点下我意识到自己的错误。不过收获也很不少。至少我又练习了运用静态链表来实现同样的功能,同时我也发现两者在很多函数上是互通的,只需稍作修改即可移植。

另外程序的不足之处是不能实现对0这个数字的存储,可以通过改变数字的存储结构方式来实现,如使用二叉链表来作为数据的存储结构,即可实现该功能。还有就是可能自己学的还不够,对于最后两个要求未能完成,不得不说这是自己学艺不精。

现在觉得以前我对数据结构的认识是那么的肤浅,因此我下定决心寒假一定好好的把数据结构复习一遍。而且本次课程设计不光增强了我程序调试的能力,还有在面对一个较大的程序要冷静,不要浮躁,先分析模块要实现的功能,再把模块划分,最后到一个一个得模块实现,并且要不断地练习,这样,一个大的程序对我来说将不成问题。

参考文献

[1]刘大有等,《数据结构》(C语言版),高等教育出版社

[2]严蔚敏等,《数据结构》(C语言版),清华大学出版社

[3]William Ford,William Topp,《Data Structure with C++》清华大学出版社[4]苏仕华等,数据结构课程设计,机械工业出版社

数据结构课程设计报告二叉排序树的实现

课程设计 课程名称数据结构课程设计 题目名称二叉排序树的实现 学院应用数学学院 专业班级 学号 学生 指导教师 2013 年 12 月 26 日

1.设计任务 1)实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上 用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信 息(至少包括学号、、成绩3项),对比查找效率,并说明 为什么二叉排序树效率高(或者低)。 2. 函数模块: 2.1.主函数main模块功能 1.通过bstree CreatTree()操作建立二叉排序树。 2.在二叉排序树t过操作bstree InsertBST(bstree t,int key,nametype name,double grade)插入一个节点。 3. 从二叉排序树t过操作void Delete(bstree &p)删除任意节点。 4. 在二叉排序树t过操作bstnode *SearchBST(bstree t,keytype key)查 找节点。 5. 在二叉排序树t过操作p=SearchBST(t,key)查询,并修改节点信息 6. 非递归遍历二叉排序树。 7. 定义函数void compare()对数组和二叉排序树的查找效率进行比较比 较。 2.2创建二叉排序树CreatTree模块 从键盘中输入关键字及记录,并同时调用插入函数并不断进行插入。最后,返回根节点T。 2.3删除模块: 二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。假设二叉排序树上删除节点为*p(指向节点的指针为p),其双亲节点为*f(节点指针为f)。若*p节点为叶子节点,则即左右均为空树,由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲节点的指针即可;若*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;若*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)。在二叉排序树中删除一个节点的算法为 void DeleteData(bstree &t,keytype key) 若二叉排序树t中存在关键字等于key的数据元素,则删除该数据元素节点,并返回TRUE,否则返回FALSE。 2.4插入模块 二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。

二叉树课程设计

实验6.1 实现二叉树各种基本运算的算法 编写一个程序algo6-1.cpp,实现二叉树的各种运算,并在此基础上设计一个主程序完成如下功能(T为如图所示的一棵二叉树): (1)以括号表示法输出二叉树T。 (2)输出H结点的左、右孩子结点值。 (3)输出二叉树T的叶子结点个数。 (4)输出二叉树T的深度。 (5)输出对二叉树T的先序遍历序列。 (6)输出对二叉树T的中序遍历序列。 (7)输出对二叉树T的后序遍历序列。 提示:创建二叉树的算法参见书上131页的算法6.4。按先序序列输入二叉树中结点的值(一个字符),#字符表示空树。输入序列: ABD##EHJ##KL##M#N###CF##G#I## 以括号表示法输出二叉树的结果为: A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))

程序段 #include #include #include //#define MAX 50 #define OK 1 //?t2?ê÷á′±í′?′¢?á11 typedef struct btnode { char Data;//?áμ?êy?Y?úèY struct btnode *Llink;//×ó×óê÷????struct btnode *Rlink;//óò×óê÷????}btnode,*btreetype; //11?ì???t2?ê÷ int InitBiTree(btreetype &T) { T=NULL; return OK; } //?¨á¢?t2?ê÷ void CreatBiTree(btreetype &T) {char ch; scanf("%c",&ch); if(ch==' ')T=NULL; else { T=(btreetype)malloc(sizeof(btnode)); if(!T)exit(-1); T->Data=ch; CreatBiTree(T->Llink); CreatBiTree(T->Rlink); } } //ê?3??áμ?μ?×óo¢×ó void LeftChild(btreetype &M,char e) {

平衡二叉树的生成过程

二叉排序树变成平衡二叉树 对于二叉查找树,尽管查找、插入及删除操作的平均运行时间为O(logn),但是它们的最差运行时间都是O(n),原因在于对树的形状没有限制。 平衡二叉树又称为AVL树,它或者是一棵空树,或者是有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左右子树的深度之差的绝对值不超过1。二叉树的的平衡因子BF为:该结点的左子树的深度减去它的右子树的深度,则平衡二叉树的所有结点的平衡因子为只可能是:-1、0和1 一棵好的平衡二叉树的特征: (1)保证有n个结点的树的高度为O(logn) (2)容易维护,也就是说,在做数据项的插入或删除操作时,为平衡树所做的一些辅助操作时间开销为O(1) 一、平衡二叉树的构造 在一棵二叉查找树中插入结点后,调整其为平衡二叉树。若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树 1.调整方法 (1)插入点位置必须满足二叉查找树的性质,即任意一棵子树的左结点都小于根结点,右结点大于根结点 (2)找出插入结点后不平衡的最小二叉树进行调整,如果是整个树不平衡,才进行整个树的调整。 2.调整方式 (1)LL型 LL型:插入位置为左子树的左结点,进行向右旋转(LL表示的是在做子树的左结点进行插入) 由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1变为2,成为不平衡的最小二叉树根结点。此时A结点顺时针右旋转,旋转过程中遵循“旋转优先”的规则,A结点替换D结点成为B结点的右子树,D结点成为A结点的左孩子。 (2)RR型

数据结构程序报告(平衡二叉树的操作)

计算机科学学院数据结构课程设计报告 平衡二叉树操作 学生姓名: 学号: 班级: 指导老师: 报告日期:

1.需求分析 1.建立平衡二叉树并进行创建、查找、插入、删除等功能。 2.设计一个实现平衡二叉树的程序,可进行创建、查找、插入、删除等操作,实现动态的输入数据,实时的输出该树结构。 3.测试数据:自选数据 2.概要设计 1.抽象数据类型定义: typedef struct BSTNode { int data; int bf; //节点的平衡因子 struct BSTNode *lchild,*rchild; //左右孩子指针 }BSTNode,*BSTree; void CreatBST(BSTree &T); //创建平衡二叉树 void R_Rotate(BSTree &p); //对以*p为根的二叉排序树作左旋处理 void L_Rotate(BSTree &p); //对以*p为根的二叉排序树作左旋处理 void LeftBalance(BSTree &T); //对以指针T所指结点为根的二叉树作左平衡旋转处理void RightBalance(BSTree &T); //对以指针T所指结点为根的二叉树作右平衡旋转处理bool InsertAVL(BSTree &T,int e,bool &taller); //插入结点e bool SearchBST(BSTree &T,int key); //查找元素key是否在树T中 void LeftBalance_div(BSTree &p,int &shorter); //删除结点时左平衡旋转处理 void RightBalance_div(BSTree &p,int &shorter); //删除结点时右平衡旋转处理 void Delete(BSTree q,BSTree &r,int &shorter); //删除结点 int DeleteA VL(BSTree &p,int x,int &shorter); //平衡二叉树的删除操作 void PrintBST(BSTree T,int m); //按树状打印输出二叉树的元素 2.主程序的流程 3.各模块之间的层次调用

课程设计二叉树

安徽理工大学 数据结构 课程设计说明书题目: 二叉树的遍历集成 院系:计算机科学与工程学院 专业班级: 学号: 学生姓名: 指导教师: 2015年 01 月 9 日

安徽理工大学课程设计(论文)任务书 计算机科学与工程学院信息安全教研室 2014年 12 月 18 日

目录 1.需求分析 (1) 2、总体设计 (1) 2.1 程序目录 (1) 2.2 算法流程 (3) 3、详细设计 (3) 3.1 界面设计 (3) 3.2 详细代码设计 (5) 3.3 调试分析 (10) 4、总结 (15) 参考文献 (16) 代码详述 (16)

1.需求分析 “数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心,而且也成为其他理工类学科必修课程,所谓”数据结构”是相互之间存在一种或多种特定关系的数据元素的集合.数据元素之间的相互关系成为结构,结构一般有线性结构,树形结构,图状结构,本程序所做的就是树形结构的二叉树的遍历算法和线索化查找. 本程序使用VC6.0++编写,具体实现功能有二叉树的遍历,包括先序遍历,中序遍历,后序遍历的递归算法以及非递归算法.另外本程序还有可线索化二叉树的功能,由此可以得到二叉树某个节点的前驱和后继. 题目要求为: 1.实现二叉树的各种遍历。包括先序遍历、中序遍历、后序遍历的递归和非递归算法、以及层次遍历。 2.要求能查找任一结点在某种遍历序列中的前驱和后继。 3.界面友好,易于操作。可采用菜单或其它人机对话方式进行选择。 由小组一起制作,本人做小组汇总工作,并在基础上加了查找某个节点是否存在二叉树,以及求二叉树总节点数等一些简单功能 2、总体设计 2.1 程序目录 (1)typedef struct node 二叉树的定义,包含数据域data,左孩子lchild,右孩子rchild,若二叉树为空,则头结

数据结构平衡二叉树的操作演示

平衡二叉树操作的演示 1.需求分析 本程序是利用平衡二叉树,实现动态查找表的基本功能:创建表,查找、插入、删除。具体功能: (1)初始,平衡二叉树为空树,操作界面给出创建、查找、插入、删除、合并、分裂六种操作供选择。每种操作均提示输入关键字。每次插入或删除一个结点后,更 新平衡二叉树的显示。 (2)平衡二叉树的显示采用凹入表现形式。 (3)合并两棵平衡二叉树。 (4)把一棵二叉树分裂为两棵平衡二叉树,使得在一棵树中的所有关键字都小于或等于x,另一棵树中的任一关键字都大于x。 如下图: 2.概要设计 平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。

具体步骤: (1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值不超过1,则平衡二叉树没有失去平衡,继续插入结点; (2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点; (3)判断新插入的结点与最小不平衡子树的根结点个关系,确定是那种类型的调整;(4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或RL型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;(5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后平衡二叉树中是否存在平衡因子大于1的结点。 流程图 3.详细设计 二叉树类型定义: typedef int Status; typedef int ElemType; typedef struct BSTNode{

二叉排序树运算-数据结构与算法课程设计报告_l

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程 数据结构与算法 课程设计 名称 二叉排序树运算学生姓名顾成方 学号0704011033 专业班级08计科(2) 指导教师王昆仑张贯虹 2010 年 5 月

题目:(二叉排序树运算问题)设计程序完成如下要求:对一组数据构造二叉排序树,并在二叉排序树中实现多种方式的查找。基本任务:⑴选择合适的储存结构构造二叉排序树;⑵对二叉排序树T作中序遍历,输出结果;⑶在二叉排序树中实现多种方式的查找,并给出二叉排序树中插入和删除的操作。 ⑷尽量给出“顺序和链式”两种不同结构下的操作,并比较。 一、问题分析和任务定义 本次程序需要完成如下要求:首先输入任一组数据,使之构造成二叉排序树,并对其作中序遍历,然后输出遍历后的数据序列;其次,该二叉排序树能实现对数据(即二叉排序树的结点)的查找、插入和删除等基本操作。 实现本程序需要解决以下几个问题: 1、如何构造二叉排序树。 2、如何通过中序遍历输出二叉排序树。 3、如何实现多种查找。 4、如何实现插入删除等操作。 二叉排序树的定义:

⑴其左子树非空,则左子树上所有结点的值均小于根结点的值。 ⑵若其右子树非空,则右子树上所有结点的值大于根结点的值。 ⑶其左右子树也分别为二叉排序树。 本问题的关键在于对于二叉排序树的构造。根据上述二叉排序树二叉排序树的生成需要通过插入算法来实现:输入(插入)的第一个数据即为根结点;继续插入,当插入的新结点的关键值小于根结点的值时就作为左孩子,当插入的新结点的关键值大于根结点的值时就作为右孩子;在左右子树中插入方法与整个二叉排序树相同。当二叉排序树建立完成后,要插入新的数据时,要先判断已建立的二叉排序树序列中是否已有当前插入数据。因此,插入算法还要包括对数据的查找判断过程。 本问题的难点在于二叉排序树的删除算法的实现。删除前,首先要进行查找,判断给出的结点是否已存在于二叉排序树之中;在删除时,为了保证删除结点后的二叉树仍为二叉排序树,要考虑各种情况,选择正确

数据结构课程设计二叉树遍历查找

课程设计任务书 2011 —2012 学年第一学期 电子与信息工程系计算机专业09计算机一班班级 课程设计名称:数据结构课程设计 设计题目:排序二叉树的遍历 完成期限:自2012 年 1 月 2 日至2012 年 1 月 6 日共 1 周 设计依据、要求及主要内容(可另加附页): 一、设计目的 熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。 二、设计要求 (1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务; (2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩; (3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表; (4)认真编写课程设计报告。 三、设计内容 排序二叉树的遍历(用递归或非递归的方法都可以) 1)问题描述 输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。 2)基本要求 (1)用菜单实现 (2)能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列和叶子结点的数目。 四、参考文献

1.王红梅.数据结构.清华大学出版社 2.王红梅.数据结构学习辅导与实验指导.清华大学出版社3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社 #include using namespace std; int num; //-----------排序二叉树节点--------------// struct tree //定义二叉树节点结构 { int data; //节点数据域 tree *right,*left; //右,左子树指针 }; //-----------排序二叉树类----------------// class Btree { tree *root;//根节点 public: Btree()

平衡二叉树(AVL)的查找、插入和删除

平衡二叉树(AVL)查找、插入和删除 小组成员: 陈静101070009 陈丹璐101070006 陈娇101070008

目录 平衡二叉树(AVL) (1) 查找、插入和删除 (1) 问题描述 (2) 设计说明 (3) (一)ADT (3) (二)算法思想 (5) (三)数据结构 (12) (四)程序结构与流程 (13) 运行平台及开发工具 (15) I/O格式 (15) 算法复杂度分析 (18) 源代码 (18) 小结 (37) 问题描述 利用平衡二叉树实现一个动态查找表。

(1)实现动态查找表的三种基本功能:查找、插入和删除。 (2)初始时,平衡二叉树为空树,操作界面给出创建、查找、插入和删除和退出五种操作供选择。每种操作均要提示输入关键字。创建时,根据提示输入数据,以-1为输入数据的结束标志,若输入数据重复,则给出已存在相同关键字的提示,并不将其插入到二叉树中。在查找时,如果查找的关键字不存在,则显示不存在查找的关键字,若存在则显示存在要查找的关键字。插入时首先检验原二叉树中是否已存在相同第3 页共38 页- 3 -的关键字,若没有则进行插入并输出二叉树,若有则给出已有相同关键字的提醒。删除时首先检验原二叉树中是否存在要删除的关键字,若有则进行删除后并输出二叉树,若没有则给出不存在要删除的关键字的提醒。 (3)平衡二叉树的显示采用中序遍历的方法输出,还可以根据输出数据是否有序验证对平衡二叉树的操作是否正确。 设计说明 (一)ADT ADT BalancedBinaryTree{ 数据对象D:D是具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标志的数据元素的关键字。 数据关系R:数据元素同属一个集合。 基本操作P: void R_Rotate(BSTree &p); 初始条件:二叉树存在,且关键字插入到以*p为根的二叉树的左子树的左孩子上; 操作结果:对以*p为根的二叉排序树作右旋处理

二叉排序树的实现_课程设计报告

中北大学 数据结构 课程设计说明书 2011年12月20日

1.设计任务概述:

功能描述: (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 2.本设计所采用的数据结构 二叉树及二叉链表 3.功能模块详细设计 详细设计思想 建立二叉排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。如果查找到相等的则插入其左子树。然后利用插入函数将该元素插入原树。 对二叉树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。 删除结点函数,采用边查找边删除的方式。如果没有查找到,进行提示;如果查找到结点则将其左子树最右边的节点的数据传给它,然后删除其左子树最右边的节点。 核心代码 (1)主菜单模块 int main(){ LNode root=NULL; int Num,a,x; printf("\n\n *******************************\n"); printf(" ************主菜单*************\n"); printf(" *1:进行中序排列*\n"); printf(" *2:进行删除操作

*\n"); printf(" *3:退出*\n"); printf(" *******************************\n"); printf("请输入要进行操作的数字以0结束:\n"); 运行结果 (3)中序遍历模块 void view(LNode p){

二叉树数据结构课程设计

目录 第一章需求分析 (1) 1.1课程设计题目 (1) 1.2 课程设计任务及要求 (1) 1.21 课程设计目的 (1) 1.22设计要求 (1) 1.3课程设计思想 (2) 1.4软件运行环境及开发工具 (2) 第二章概要设计 (3) 2.1 数据结构 (3) 2.2 所用方法及其原理说明 (3) 第三章详细设计 (4) 3.1详细设计方案 (4) 3.2 模块设计 (4) 3.21二叉树定义 (4) 3.22 树状显示二叉树设计 (7) 3.22 主函数设计 (10) 第四章调试和操作说明 (11) 4.1 调试 (11) 4.2 操作说明 (12) 第五章总结与体会 (12) 5.1本文的主要工作 (12) 5.2 存在问题 (12) 5.3心得体会 (12) 致谢 (13) 参考文献 (14)

第一章需求分析 1.1课程设计题目 树状显示二叉树: 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出; 第1层:因为根节点缩进了32个空格,所以下一层的偏移量(offset)为32/2=16=screenwidth/22。即第一层的两个节点的位置为(1,32-offset),(1,32+offset)即(1,16),(1,48)。 第二层:第二层的偏移量offset为screenwidth/23。第二层的四个节点的位置分别是(2,16-offset),(2,16+offset),(2,48-offset),(2,48+offset)即(2,8),(2,24),(2,40),(2,56)。 …… 第i层:第i层的偏移量offset为screenwidth/2i+1。第i层的每个节点的位置是访问第i-1层其双亲节点时确定的。假设其双亲的位置为(i-1,parentpos)。若其第i层的节点是其左孩子,那末左孩子的位置是(i,parentpos-offset),右孩子的位置是(i,parentpos+offset)。 [实现提示] 利用二叉树的层次遍历算法实现。利用两个队列Q,QI。队列Q中存放节点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。当节点被加入到Q时,相应的打印信息被存到QI中。二叉树本身采用二叉链表存储。 1.2 课程设计任务及要求 1.21 课程设计目的 据结构是计算机专业的核心课程,是一门实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。 1.22设计要求 1、课程设计题目每组一题,每个学生必须独立完成; 2、课程设计时间为2周; 3、设计语言C(C++)不限; 1

平衡二叉树操作演示

数据结构实习报告 题目:平衡二叉树的操作演示 班级:信息管理与信息系统11-1 :佳 学号:3 完成日期:2013.06.25

一、需求分析 1. 初始,平衡二叉树为空树,操作界面给出两棵平衡二叉树的显示、查找、插入、删除、销毁、合并两棵树,几种选择。其中查找、插入和删除操作均要提示用户输入关键字。每次插入或删除一个节点后都会更新平衡二叉树的显示。 2. 平衡二叉树的显示采用凹入表形式。 3.每次操作完毕后都会给出相应的操作结果,并进入下一次操作,知道用户选择退出 二、概要设计 1.平衡二叉树的抽象数据类型定义: ADT BalancedBinaryTree{ 数据对象D:D是具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标志的数据元素的关键字。 数据关系R:数据元素同属一个集合。 基本操作P: InitAVL(BSTree& T) 操作结果:构造一个空的平衡二叉树T DestroyAVL(BSTree& T) 初始条件:平衡二叉树T存在 操作结果:销毁平衡二叉树T SearchAVL(BSTree T,int key) 初始条件:平衡二叉树T存在,key为和关键字相同类型的给定值 操作结果:若T中存在关键字和key相等的数据元素,则返回指向该元素的 指针,否则为空 InsertAVL(BSTree& T,int key,Status& taller) 初始条件:平衡二叉树T存在,key和关键字的类型相同 操作结果:若T中存在关键字等于key的数据元素则返回,若不存在则插入 一个关键字为key的元素 DeleteAVL(BSTree& T,int &key,Status& lower) 初始条件:平衡二叉树T存在,key和关键字的类型相同 操作结果:若T中存在关键字和key相同的数据元素则删除它}ADT BalancedBinaryTree

数据结构课程设计-二叉树的基本操作

二叉树的基本操作 摘要: 本次课程设计通过对二叉树的一系列操作主要练习了二叉树的建立、四种遍历方式:先序遍历、中序遍历、后序遍历和层序遍历以及节点数和深度的统计等算法。增加了对二叉树这一数据结构的理解,掌握了使用c语言对二叉树进行一些基本的操作。 关键字:递归、二叉树、层序遍历、子树交换 一、程序简介 本程序名为“二叉树基本操作的实现”,其主要为练习二叉树的基本操作而开发,其中包含了建立、遍历、统计叶子结点和深度等一系列操作。其中定义二叉链表来表示二叉树,用一个字符类型的数据来表示每一个节点中存储的数据。由于没有进行图形界面的设计,用户可以通过程序中的遍历二叉树一功能来查看操作的二叉树。 二、功能模块 2.1功能模块图 2.2功能模块详解 2.2.1建立二叉树

输入要建立的二叉树的扩展二叉树的先序遍历序列,来建立二叉树,建立成功会给出提示。 2.2.2遍历二叉树 执行操作之后会有四个选项可供选择:先序遍历、中序遍历、后序遍历、层序遍历。 输入对应的序号即可调动相关函数输出相应的遍历序列。 2.2.3统计叶子节点树 执行之后输出叶子结点的个数。 2.2.4求二叉树深度 执行之后输出二叉树的深度。 2.2.5子树交换 交换成功则会给出提示,用户可通过遍历二叉树来观察子树交换之后的二叉树。 三、数据结构和算法设计 3.1二叉链表的设计 1.typedef struct BiNode { 2.char data; 3.struct BiNode* lchild; //左孩子 4.struct BiNode* rchild; //右孩子 5.}BiTree; 用一个字符型保存节点数据,分别定义两个struct BiNode类型的指针来指向左孩子和右孩子。在BiTree.h中实现相关的功能。 3.2队列的实现 1.typedef struct { 2. ElemType* data; 3.int head;//队头指针 4.int tail;//队尾指针 5.} SqQueue; 队列主要用于二叉树遍历过程中的层序遍历,从根节点开始分别将左右孩子放入队列,然后从对头开始输出。队列的相关操作封装在SqQueue.h中,包括入队、出队、判断队列是否为空等操作。

平衡二叉树 构造方法(绝妙)

平衡二叉树构造方法 平衡二叉树 对于二叉查找树,尽管查找、插入及删除操作的平均运行时间为O(logn),但是它们的最差运行时间都是O(n),原因在于对树的形状没有限制。 平衡二叉树又称为AVL树,它或者是一棵空树,或者是有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左右子树的深度之差的绝对值不超过1。二叉树的的平衡因子BF为:该结点的左子树的深度减去它的右子树的深度,则平衡二叉树的所有结点的平衡因子为只可能是:-1、0和1 一棵好的平衡二叉树的特征: (1)保证有n个结点的树的高度为O(logn) (2)容易维护,也就是说,在做数据项的插入或删除操作时,为平衡树所做的一些辅助操作时间开销为O(1) 一、平衡二叉树的构造 在一棵二叉查找树中插入结点后,调整其为平衡二叉树。若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树 1.调整方法 (1)插入点位置必须满足二叉查找树的性质,即任意一棵子树的左结点都小于根结点,右结点大于根结点 (2)找出插入结点后不平衡的最小二叉树进行调整,如果是整个树不平衡,才进行整个树的调整。 2.调整方式 (1)LL型 LL型:插入位置为左子树的左结点,进行向右旋转

由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1变为2,成为不平衡的最小二叉树根结点。此时A结点顺时针右旋转,旋转过程中遵循“旋转优先”的规则,A结点替换D结点成为B结点的右子树,D结点成为A结点的左孩子。 (2)RR型 RR型:插入位置为右子树的右孩子,进行向左旋转 由于在A的右子树C的右子树插入了结点F,A的平衡因子由-1变为-2,成为不平衡的最小二叉树根结点。此时,A结点逆时针左旋转,遵循“旋转优先”的规则,A结点替换D结点成为C的左子树,D结点成为A的右子树。 (3)LR型 LR型:插入位置为左子树的右孩子,要进行两次旋转,先左旋转,再右旋转;第一次最小不平衡子树的根结点先不动,调整插入结点所在的子树,第二次再调整最小不平衡子树。 由于在A的左子树B的右子树上插入了结点F,A的平衡因子由1变为了2,成为不平衡的最小二叉树根结点。第一次旋转A结点不动,先将B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。 (4)RL型 RL型:插入位置为右子树的左孩子,进行两次调整,先右旋转再左旋转;处理情况与LR 类似。

二叉树遍历课程设计心得【模版】

目录 一.选题背景 (1) 二.问题描述 (1) 三.概要设计 (2) 3.1.创建二叉树 (2) 3.2.二叉树的非递归前序遍历示意图 (2) 3.3.二叉树的非递归中序遍历示意图 (2) 3.4.二叉树的后序非递归遍历示意图 (3) 四.详细设计 (3) 4.1创建二叉树 (3) 4.2二叉树的非递归前序遍历算法 (3) 4.3二叉树的非递归中序遍历算法 (4) 4.4二叉树的非递归后序遍历算法 (5) 五.测试数据与分析 (6) 六.源代码 (6) 总结 (10) 参考文献: (11)

一.选题背景 二叉树的链式存储结构是用指针建立二叉树中结点之间的关系。二叉链存储结构的每个结点包含三个域,分别是数据域,左孩子指针域,右孩子指针域。因此每个结点为 由二叉树的定义知可把其遍历设计成递归算法。共有前序遍历、中序遍历、后序遍历。可先用这三种遍历输出二叉树的结点。 然而所有递归算法都可以借助堆栈转换成为非递归算法。以前序遍历为例,它要求首先要访问根节点,然后前序遍历左子树和前序遍历右子树。特点在于所有未被访问的节点中,最后访问结点的左子树的根结点将最先被访问,这与堆栈的特点相吻合。因此可借助堆栈实现二叉树的非递归遍历。将输出结果与递归结果比较来检验正确性。。 二.问题描述 对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈的五种基本运算(置空栈、进栈、出栈、取栈顶元素、判栈空)实现二叉树的先序、中序、后序三种遍历,输出三种遍历的结果。画出搜索顺序示意图。

三.概要设计 3.1.创建二叉树 3.2.二叉树的非递归前序遍历示意图 图3.2二叉树前序遍历示意图3.3.二叉树的非递归中序遍历示意图 图3.3二叉树中序遍历示意图

数据结构程序报告(平衡二叉树的操作)

数据结构程序报告(平衡二叉树的操作)

计算机科学学院数据结构课程设计报告 平衡二叉树操作 学生姓名: 学号: 班级: 指导老师: 报告日期:

1.需求分析 1.建立平衡二叉树并进行创建、查找、插入、删除等功能。 2.设计一个实现平衡二叉树的程序,可进行创建、查找、插入、删除等操作,实现动态的输入数据,实时的输出该树结构。 3.测试数据:自选数据 2.概要设计 1.抽象数据类型定义: typedef struct BSTNode { int data; int bf; //节点的平衡因子 struct BSTNode *lchild,*rchild; //左右孩子指针 }BSTNode,*BSTree; void CreatBST(BSTree &T); //创建平衡二叉树 void R_Rotate(BSTree &p); //对以*p 为根的二叉排序树作左旋处理 void L_Rotate(BSTree &p); //对以*p 为根的二叉排序树作左旋处理 void LeftBalance(BSTree &T); //对以指针T所指结点为根的二叉树作左平衡旋转处理void RightBalance(BSTree &T); //对以指针T所指结点为根的二叉树作右平衡旋转处理bool InsertA VL(BSTree &T,int e,bool &taller);

//插入结点e bool SearchBST(BSTree &T,int key); //查找元素key是否在树T中 void LeftBalance_div(BSTree &p,int &shorter); void RightBalance_div(BSTree &p,int &shorter);

数据结构课程设计_二叉排序树的实现

数据结构课程设计 一、引言 数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力。 数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。 实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,我们都会有不同程度上的提高。 二、课程设计目的 本课程是数据结构课程的实践环节。主要目的在于加强学生在课程中学习的相关算法和这些方法的具体应用,使学生进一步掌握在C++或其他语言中应用这些算法的能力。通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解。

三、内容设计要求 二叉排序树的实现: 用顺序和二叉链表作存储结构 1)以回车(…\n?)为输入结束标志,输入数列L,生成一棵二叉排序树T; 2)对二叉排序树T作中序遍历,输出结果; 3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 (一)问题分析和任务定义 对问题的描述应避开具体的算法和涉及的数据结构,它是对要完成的任务作出明确的回答,强调的是做什么,而不是怎么做。 (二)详细的设计和编码 算法的具体描述和代码的书写。 (三)上机调试 源程序的输入和代码的调试。 要求:设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,深刻理解、牢固的掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。 四、源代码 1、用二叉链表存储结构实现 #include using namespace std;

数据结构课程设计--按层次遍历二叉树

数据结构课程设计--按层次遍历二叉树学号: 题目按层次遍历二叉树学院计算机科学与技术专业计算机科学与技术 班级 姓名 指导教师 2013年6月20日 1 1问题描述及要求 (4) 1.1问题描述 (4) 1.2任务要求.................................. 4 2 开发平台及所使用软件.............................. 4 3 程序设计思路.. (5) 3.1二叉树存储结构设计 (5) 3.2题目算法设

计 (5) 3.2.1 建立二叉树 (5) 3.2.2 遍历二叉树 (5) 3.3.3 按要求格式输出已建立的二叉 树 (6) 3.3 测试程序................................ 6 4 调试 报告.................................... 6 5 经验和体会.................................. 6 6 源程序清单及运行结果 (7) 6.1 源程序清单 (7) 6.2 运行结果................................ 9 7 参考文献................................... 10 本科生课程设计成绩评定表 (11) 2 课程设计任务书 学生姓名:专业班级:计科ZY1102班指导教师:工作单位:计算机科学系题目: 按层次遍历二叉树 初始条件:

编写按层次顺序(同一层自左至右)遍历二叉树的算法。 (1)二叉树采用二叉链表作为存储结构。 ⑵按严蔚敏《数据结构习题集(C语言版)》p44面题6.69所指定的格式输出建立的二叉树。 (3)输出层次遍历结果。 (4)自行设计测试用例。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1.问题描述 简述题目要解决的问题是什么。 2. 设计 存储结构设计、主要算法设计(用类C/C++语言或用框图描述)、测试用例设计; 3. 调试报告 调试过程中遇到的问题是如何解决的; 对设计和编码的讨论和分析。 4. 经验和体会(包括对算法改进的设想) 5. 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结 果要包含这些测试数据和运行输出。 说明: 1. 设计报告、程序不得相互抄袭和拷贝; 若有雷同,则所有雷同者成绩均为0 分。 2. 凡拷贝往年任务书或课程设计充数者,成绩一律无效,以0 分记。时间安排: 1(第17周完成,验收时间由指导教师指定

《二叉排序树的操作》课程设计报告

内蒙古科技大学 本科生课程设计论文《数据结构与算法》 题目:二叉排序树的操作 学生姓名:贺英杰 学号:1367159108 专业:软件工程 班级:13-1班 指导教师:周李涌 日期:2015年1月6日

内蒙古科技大学课程设计任务书课程名称数据结构与算法课程设计 设计题目二叉排序树的操作 指导教师周李涌时间2015.1.5——2015.1.9 一、教学要求 1. 掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力 2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能 3. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力 4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风 二、设计资料及参数 每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。 二叉排序树的操作 以二叉链表表示二叉排序树,在此基础上实现二叉排序树的操作。 要求设计类(或类模板)来描述二叉排序树,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数: 创建二叉排序树 输出二叉排序树 在二叉排序树中查找给定值 在二叉排序树中插入新结点 在二叉排序树中删除给定值 并设计主函数测试该类(或类模板)。 三、设计要求及成果 1. 分析课程设计题目的要求 2. 写出详细设计说明 3. 编写程序代码,调试程序使其能正确运行 4. 设计完成的软件要便于操作和使用 5. 设计完成后提交课程设计报告 四、进度安排 资料查阅与讨论(1天) 系统分析(2天) 系统的开发与测试(5天) 编写课程设计说明书和验收(2天) 五、评分标准 1. 根据平时上机考勤、表现和进度,教师将每天点名和检查 2. 根据课程设计完成情况,必须有可运行的软件。 3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。 4. 根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问 六、建议参考资料 1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11 2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等编著,清华大学出版社 2007.2 3.《数据结构:用面向对象方法与C++语言描述》,殷人昆主编,清华大学出版社 2007.6

二叉树数据结构课程设计报告

数据结构课程设计报告题目:线索二叉树的应用 院(系):计算机工程学院 专业:嵌入式系统软件设计方向 班级:嵌入式109(1) 学生:黄江彬 指导教师:寇海洲殷路 邱军林孙成富 2010年12月

目录 1.设计目的 (3) 2.总体设计 (3) 2.1首先创建一个线索二叉树 (3) 2.2功能函数的实现 (4) 3.调试分析 (7) 4.测试结果 (7) 5课程设计小结. (10)

1.设计目的 线索二叉树的应用: 创建线索二叉树,实现二叉树的建立,插入,删除,恢复线索的算法。2.总体设计 实现过程和步骤提示: 2.1首先创建一个线索二叉树 2.1.1功能说明:程序首先显示创建线索二叉树的界面,并等待用户输入命令(见图1-1所示)。假如用户输入ABCE##F##D##G##,程序将在显示屏上输出运算结果(见图1-2所示)。 图1-1 图1-2

2.1.2创建线索二叉树的程序代码: //创建二叉树ABD#GJ##K##E##C#FH##IL### ABCD##E###F#GH##I#J#K## void Creat(Bitree *p) //指向指针的指针 { char ch=getchar(); if(ch=='#') (*p)=NULL; else { //Bitree k; *p=(Bitreenode *)malloc(sizeof(Bitreenode)); (*p)->data=ch; Creat(&(*p)->lchild); Creat(&(*p)->rchild); } //return 1; } 2.1.3创建线索二叉树系统菜单实现提示: (1).遇“#”则该结点为空; (2).直接从键盘获取字符串. 2.2功能函数的实现 2.2.1二叉树的遍历 2.2.1.1功能说明:对用户输入的二叉树进行遍历 2.2.1.2二叉树的遍历程序代码: //先序遍历 void First(Bitree p) { if(p) { printf("%2c",p->data); First(p->lchild); First(p->rchild); } } //中序遍历 void Middle(Bitree p) { if(p) { Middle(p->lchild); printf("%2c",p->data); Middle(p->child); }

相关文档
最新文档