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

合集下载

数据结构课程设计---二叉排序树和平衡二叉树的判别

数据结构课程设计---二叉排序树和平衡二叉树的判别

数据结构课程设计---二叉排序树和平衡二叉树的判别二叉排序树和平衡二叉树的判别1引言数据结构是软件工程的一门核心专业基础课程,在我们专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。

学习数据结构的最终目的是为了获得求解问题的能力。

对于现实世界中的问题,应该能从中抽象出一个适当的数据模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,在进行编程调试,最后获得问题的解答。

本次课程设计的题目是对二叉排序树和平衡二叉树的扩展延伸应用。

首先我们得建立一个二叉树,二叉树有顺序存储结构和链式存储结构两种存储结构,此次我选用的是二叉链表的存储结构。

对于判断平衡二叉树,需要求出其每个叶子结点所在的层数,这里我采用的边遍历边求的方式,遍历采用的是先序遍历。

二叉树的建立以及二叉排序树和平衡二叉树的判别中都用到了递归思想。

2需求分析2.1在日常生活中,人们几乎每天都要进行“查找”工作。

所谓“查找”即为在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据元素(或记录),即关键字。

2.2本程序意为对一个已经建立的动态查找表——二叉树——判断其是否是二叉排序树和平衡二叉树。

3数据结构设计3.1抽象数据类型二叉树的定义如下:ADT BinaryTree{3.1.1数据对象D:D是具有相同特性的数据元素的集合。

3.1.2数据关系R:若D=NULL,则R=NULL,称BinaryTree为空的二叉树;若D!=NULL,则R={H},H是如下的二元关系:3.1.2.1在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;3.1.2.2若D-{root}!=NULL,则存在D-{root}={Dl,Dr},且Dl与Dr相交为空;3.1.2.3若Dl!=NULL,则Dl中存在唯一的元素xl,<root,xl>属于H,且存在Dl上的关系Hl属于H;若Dr!=NULL,则Dr中存在唯一的元素xr,<root,xr>属于H,且存在Dr上的关系Hr属于H;H={<root,xl>,<root,xr>,Hl,Hr};3.1.2.4(Dl,{Hl})是一棵符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。

二叉排序实现课程设计

二叉排序实现课程设计

二叉排序实现课程设计一、课程目标知识目标:1. 理解二叉排序树的基本概念,掌握其结构特点及操作原理;2. 学会使用二叉排序树进行数据排序,并掌握二叉排序树的插入、删除、查找等基本操作;3. 了解二叉排序树与其他排序算法的优缺点,明确其适用场景。

技能目标:1. 能够独立构建二叉排序树,进行数据的排序与查找;2. 能够分析并解决二叉排序树在实际应用中遇到的问题,如平衡二叉树、优化查找效率等;3. 能够运用所学知识,解决实际生活中的排序问题。

情感态度价值观目标:1. 培养学生的逻辑思维能力和问题解决能力,使其在面对复杂问题时,能够运用所学知识进行分析和解决;2. 增强学生的团队协作意识,通过小组讨论和实践,培养学生的沟通能力和合作精神;3. 激发学生的学习兴趣,使其在掌握二叉排序树的基础上,探索更多数据结构与算法的知识,为以后的学习打下坚实基础。

课程性质:本课程为数据结构与算法领域的基础课程,旨在帮助学生掌握二叉排序树的基本概念与操作方法,提高其编程实践能力。

学生特点:学生具备一定的编程基础,熟悉基本的数据结构和算法,但对二叉排序树的理解和应用尚浅。

教学要求:结合学生特点,注重理论与实践相结合,通过案例分析和动手实践,使学生深入理解二叉排序树,提高其编程水平。

同时,注重培养学生的逻辑思维和团队协作能力,提高其综合素质。

二、教学内容1. 引言:介绍排序算法在计算机科学中的应用,引出二叉排序树的概念及其重要性。

- 排序算法概述- 二叉排序树的基本概念2. 二叉排序树的构建与性质:- 二叉排序树的定义及结构- 二叉排序树的构建方法- 二叉排序树的性质与判定3. 二叉排序树的基本操作:- 插入操作- 删除操作- 查找操作- 遍历操作4. 二叉排序树的优化与应用:- 平衡二叉树的概念及实现- 二叉排序树在实际应用中的优化- 二叉排序树与其他排序算法的性能比较5. 实践与案例分析:- 动手实践:构建二叉排序树,实现基本操作- 案例分析:解决实际问题,分析二叉排序树的优缺点教学内容安排与进度:1. 引言与二叉排序树的构建:1课时2. 二叉排序树的基本操作:2课时3. 二叉排序树的优化与应用:2课时4. 实践与案例分析:3课时教材章节关联:1. 《数据结构与算法》第三章:树与二叉树2. 《数据结构与算法》第四章:二叉树的应用教学内容旨在帮助学生系统地掌握二叉排序树的相关知识,结合实践与案例分析,提高学生的编程实践能力和问题解决能力。

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

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

中北大学数据结构课程设计说明书2011年12月20日1.设计任务概述:功能描述:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。

2.本设计所采用的数据结构二叉树及二叉链表3.功能模块详细设计3.1 详细设计思想建立二叉排序树采用边查找边插入的方式。

查找函数采用递归的方式进行查找。

如果查找到相等的则插入其左子树。

然后利用插入函数将该元素插入原树。

对二叉树进行中序遍历采用递归函数的方式。

在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。

删除结点函数,采用边查找边删除的方式。

如果没有查找到,进行提示;如果查找到结点则将其左子树最右边的节点的数据传给它,然后删除其左子树最右边的节点。

3.2 核心代码(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){//中序遍历函数if(p){view(p->lch);printf("%d ",p->date);view(p->rch);//递归调用return;}return;}运行结果(3)删除模块LNode DelNode(LNode t,int x) {LNode p=t;LNode q=NULL;LNode s;LNode f;while(p!=NULL){if(p->date==x){break;}q=p;if(x<=p->date){p=p->lch;}else{p=p->rch;}}if(p==NULL){printf("不存在您要删除的数 %d !",x);return p;}if(p->lch){s=p->lch; //s指向其左子树;f=p->lch; //f指向其左子树;while(s-> rch)//搜索左子树的最右边的叶子结点{f=s;s=s->rch;}p->date=s->date;if(f !=s){ //若不是p的左孩子,把r的左孩子作为r的父亲的右孩子f-> rch=s->lch;}else {p->lch = s->lch; //否则结点p的左子树指向s的左子树}free(s);return p;}else{if(q->lch==p){q->lch = p->rch;}else{q->rch = p->rch;}free(p);return q;}}3.3 程序运行结果4.课程设计心得、存在问题及解决方法通过这次课程设计,我进一步的懂得了二叉链表的建立方法,进一步的了解了二叉排序树的构造方法。

急求数据结构-平衡二叉树课程设计

急求数据结构-平衡二叉树课程设计

急求数据结构-平衡二叉树课程设计平衡二叉树课程设计
一、什么是平衡二叉树平衡二叉树(Balanced Binary Tree),又称AVL树,是一种特殊的二叉查找树,它的每个
节点的两个子树的高度最大差别为
1,平衡二叉树的搜索、插入和删除操作只需要O(logn)的时间复杂度,而普通的二叉查找树则需要O(n)的时间复杂度。

二、平衡二叉树的特点
1、平衡二叉树的每个节点的左右子树的高度差不超过1;
2、平衡二叉树的搜索、插入和删除操作只需要O(logn)的时间复杂度;
3、平衡二叉树的高度可以保持在log2n的高度;
4、平衡二叉树可以用来建立字典和查找表,以及其他应用;
5、平衡二叉树可以用来存储已经排序的数据,以提高搜
索效率。

三、平衡二叉树的实现
1、插入操作插入新节点的操作可以分为两步:首先,将新节点插入到树中,其次,进行调整,使树保持平衡。

2、删除操作删除节点的操作可以分为三步:首先,将要删除的节点从树中移除,其次,找到要删除节点的子节点,最后,将子节点插入到树中,以保证树的平衡性。

3、查找操作查找操作是在平衡二叉树中最常见的操作,它可以在O(logn)的时间内找到目标节点。

四、平衡二叉树课程设计
1、首先,学生需要研究二叉树的基本概念,以及普通二叉查找树的实现;
2、其次,学生需要了解平衡二叉树的概念、特点,并掌握它的实现方法;
3、然后,学生需要编写一个程序,来实现平衡二叉树的插入、删除和查找操作;
4、最后,学生需要编写一个测试程序,来验证程序的正确性。

二叉排序树与平衡二叉树的实现

二叉排序树与平衡二叉树的实现

课程设计报告设计题目:二叉排序树与平衡二叉树的实现专业班级学生学号指导教师起止时间年学期目录1.需求分析: (3)1.1课程设计题目、任务及要求: (3)1.2课程设计思想: (3)2.概要设计: (5)2.1二叉排序树的定义: (5)2.2二叉排序的存储结构: (5)2.3模块划分: (5)2.4主函数流程图: (6)3.详细设计和代码: (8)3.1二叉链表: (8)3.2顺序表: (14)4.心得与体会: (18)1.需求分析:1.1课程设计题目、任务及要求:用二叉链表作存储结构:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果;(4)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;用顺序表(一维数组)作存储结构:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果;(4)输入元素x,查找二叉排序树T:若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;1.2课程设计思想:生成二叉排序树:建立二叉排序树采用的是边查找边插入的方式。

查找函数采用递归的方式进行查找。

查找是按照二叉排序树的性质进行的,通过比较要插入元素的关键字与当前结点关键字的大小来决定我们是遍历当前结点的哪个子树。

如果小于当前结点关键字,则遍历它的左子树;大于当前结点关键字,则遍历它的右子树;等于当前关键字,则此元素不插入原树。

我们按照这样的规律,一直向下遍历,知道它的子树为空,则返回当前结点的上一个结点。

然后利用插入函数将该元素插入原树。

中序遍历:对二叉排序树进行中序遍历采用递归函数的方式。

数据结构课程设计:平衡二叉树

数据结构课程设计:平衡二叉树

数据结构课程设计:平衡二叉树目录1 课程设计的目的和内容..............................................1课程设计目的 ................................................ 1 1.11.2 主要内容 (1)2 课程设计分析 (2)2.1 程序的目的和要求 (2)2.2 程序的主要数据和功能模块 (2)3 详细设计 (5)3.1 程序主要功能模块的伪代码算法 (5)3.2 程序主要流程图 (8)4 测试数据与测试结果................................................ 9 5 程序的使用和改进. (14)5.1 用户使用说明 (14)5.2 程序的改进 (14)6 课程设计小结..................................................... 15 7 参考文献 (15)1 平衡二叉树1 课程设计的目的和内容1.1 课程设计目的复习二叉树的三叉链表存储结构和遍历方法。

掌握二叉排序树的特点和生成方法。

掌握平衡二叉树四种不平衡形态的判定和旋转为平衡的方法。

1.2 主要内容(1)输入结点数据,构造二叉树的结点,按二叉排序树的规则插入该结点到三叉链表中;(2)通过插入函数InsertAVL(BSTNode* &T,int key)插入新结点到二叉树中,并递归调用插入函数本身,直到正确插入到二叉树中,并返回上次递归,每返回上次递归一次同时判断其平衡度bf,找到最小不平衡树的根结点p。

(3)判断最小不平衡树的平衡因子(bf)的值,若bf>1, 则调用左平衡函数LeftBalance(),若bf<-1,则调用右平衡函RightBalance(),再判断根结点p的左(右)孩子的平衡因子(共有LL型、LR型、RR型、RL型四种),然后判定得到的不平衡形态调用不同的旋转函数即可将其重新调整为平衡二叉树;(4)重复步骤(1)(2)(3),直到所有结点都插入到该平衡二叉树中为止;(5)输出该二叉树的前序(或者后序)序列和中序序列,手工恢复出该二叉树,检验其是否为平衡二叉树;并验证其中序序列的有序性。

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

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

课程设计报告——数据结构题目:二叉排序树姓名:学号:专业:班级:指导老师:年月日目录一、课程设计简介 (3)二、原理分析及流程 (3)2.1、原理分析 (3)2.2、流程图 (4)1、main()函数 (4)2、创建 (4)3、插入 (5)4、查找 (6)5、中序遍历输出 (7)三、算法描述 (8)3.1、存储结构 (8)3.2、插入算法 (8)3.3、查找算法 (9)3.4、删除算法 (10)四、小结与体会 (12)五、程序执行过程 (13)5.1、创建二叉排序树并中序输出 (13)5.2、插入并中序输出 (13)5.3、查找 (14)六、程序清单 (14)一、课程设计简介1.1、题目:二叉排序树相关操作1、创建二叉排序树;2、插入给定值;3、查找给定值;4、删除给定值的结点。

1.2、报告要求:1、封面;2、题目与流程图或模块图;3、程序清单和运行结果;4、小结(收获和体会);5、装订成册。

1.3、目的:课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。

提高学生适应实际,实践编程的能力。

二、原理分析及流程2.1、原理分析:根据题目要求,要实现这些功能,就必须创建一个菜单。

这个菜单设置在main()函数里面,然后使用while()...switch()语句进行循环调用相关函数,以达到实现相关功能的目的。

2.2、流程图:1、main()函数:23、插入:4、查找:5、中序遍历输出:三、算法描述3.1、存储结构定义一个链表式的二叉排序树,用链表的方式构造结点,存储二叉排序树中的结点、结点类型和指针类型如下:#include <stdio.h>#define null 0typedef int keytype;typedef struct node{keytype key;struct node *lchild,*rchild;}bstnode,*bstree;3.2、插入算法在二叉排序树中插入一个新节点,首先要查找该节点在二叉排序树中是否已经存在。

二叉排序树课程设计

二叉排序树课程设计

二叉排序树课程设计一、课程目标知识目标:1. 学生能够理解二叉排序树的基本概念和性质,掌握其结构特点和应用场景。

2. 学生能够掌握二叉排序树的插入、删除和查找操作,并了解其时间复杂度。

3. 学生能够理解二叉排序树与其他排序算法的关系,了解其在排序中的应用。

技能目标:1. 学生能够运用所学知识,独立构建二叉排序树,并实现插入、删除和查找功能。

2. 学生能够分析二叉排序树的性能,对其进行优化,提高排序效率。

3. 学生能够运用二叉排序树解决实际问题,如数据排序、查找等。

情感态度价值观目标:1. 学生通过学习二叉排序树,培养对数据结构和算法的兴趣,提高解决问题的能力。

2. 学生在学习过程中,学会合作、交流,培养团队精神和共享意识。

3. 学生能够认识到二叉排序树在实际应用中的价值,激发对计算机科学的热爱。

本课程针对高中年级学生,课程性质为理论与实践相结合。

在教学过程中,注重启发式教学,引导学生主动探究、实践。

根据学生特点和教学要求,课程目标具体、可衡量,以便学生和教师能够清晰地了解课程的预期成果。

课程目标的分解为具体的学习成果,为后续的教学设计和评估提供依据。

二、教学内容1. 引入二叉排序树的概念,讲解其定义、性质和基本操作。

- 理解二叉树的基础知识,回顾二叉树的遍历方法。

- 介绍二叉排序树的定义,阐述其特点及应用场景。

- 分析二叉排序树的性质,如二叉排序树的中序遍历结果为有序序列。

2. 探讨二叉排序树的构建、插入、删除和查找操作。

- 讲解二叉排序树的构建方法,学会从无序数据建立二叉排序树。

- 分析插入、删除和查找操作的步骤,理解它们的时间复杂度。

- 举例说明如何利用二叉排序树实现数据排序和查找。

3. 分析二叉排序树的性能及优化方法。

- 探讨二叉排序树的高度、平衡因子等性能指标。

- 介绍常见的优化方法,如平衡二叉树(AVL树)和红黑树。

4. 实践环节:二叉排序树的应用。

- 设计实践题目,让学生动手实现二叉排序树的基本操作。

二叉排序树课程设计

二叉排序树课程设计

二叉排序树课程设计一、课程目标知识目标:1. 理解二叉排序树的概念和特点;2. 掌握二叉排序树的插入、删除和查找操作;3. 能够分析二叉排序树的时间复杂度;4. 了解二叉排序树在实际应用中的优势。

技能目标:1. 能够手动构建二叉排序树并进行基本操作;2. 能够运用编程语言实现二叉排序树的基本功能;3. 能够分析并解决二叉排序树相关的问题;4. 能够运用二叉排序树解决实际排序和查找问题。

情感态度价值观目标:1. 培养学生对数据结构和算法的兴趣,激发学习热情;2. 培养学生的逻辑思维能力和问题解决能力;3. 培养学生的团队协作意识,学会与他人共同分析、解决问题;4. 培养学生严谨的科学态度,注重算法的正确性和效率。

课程性质:本课程为计算机科学领域的数据结构与算法课程,旨在让学生掌握二叉排序树的基本概念和操作,提高学生的编程能力和逻辑思维能力。

学生特点:学生具备基本的计算机知识和编程基础,对数据结构有一定了解,但对二叉排序树的认识可能较浅。

教学要求:结合学生特点,采用讲解、实践和讨论相结合的教学方法,使学生在理解二叉排序树理论知识的基础上,能够动手实践并解决实际问题。

在教学过程中,注重培养学生的自主学习能力和团队合作精神,提高学生的综合素质。

通过本课程的学习,使学生能够达到上述课程目标,为后续相关课程打下坚实基础。

二、教学内容1. 引入二叉排序树的概念,阐述其定义、性质和应用场景;- 教材章节:第三章第一节“二叉排序树的定义和性质”2. 讲解二叉排序树的插入、删除、查找操作及其实现方法;- 教材章节:第三章第二节“二叉排序树的操作”3. 分析二叉排序树的性能特点,包括时间复杂度和空间复杂度;- 教材章节:第三章第三节“二叉排序树的性能分析”4. 介绍二叉排序树在实际应用中的优势,如排序、查找等;- 教材章节:第三章第四节“二叉排序树的应用”5. 结合实例,让学生动手实践二叉排序树的构建和操作;- 教材章节:第三章实例分析与编程练习6. 总结二叉排序树的特点和适用场景,与其他排序方法进行对比;- 教材章节:第三章总结与拓展教学进度安排:1. 第1课时:引入二叉排序树的概念、性质和应用场景;2. 第2课时:讲解二叉排序树的插入、删除、查找操作;3. 第3课时:分析二叉排序树的性能特点;4. 第4课时:介绍二叉排序树在实际应用中的优势;5. 第5课时:结合实例,学生动手实践二叉排序树的构建和操作;6. 第6课时:总结二叉排序树,与其他排序方法进行对比。

数据结构平衡二叉树课程设计

数据结构平衡二叉树课程设计

数据结构平衡二叉树课程设计数据结构是计算机科学中的基础,平衡二叉树是其中比较重要的一种数据结构。

平衡二叉树是一种特殊的二叉搜索树,它能够保持树的平衡,从而使插入、删除、查找节点的时间复杂度为 O(log n)。

为了更好地学习和理解平衡二叉树,最好是通过一个课程设计来实践。

第一步:学习基本概念在开始设计平衡二叉树课程之前,需要先学习一些基本概念。

这包括什么是二叉搜索树,什么是平衡树以及如何实现平衡树。

二叉搜索树是一种有序树,左子树的节点值小于根节点的值,右子树的节点值大于根节点的值。

平衡树是一种特殊的二叉搜索树,它需要满足任意节点的左右子树高度差不超过1。

平衡树有很多种实现方式,如AVL 树、红黑树等。

第二步:设计课程内容在设计平衡二叉树课程时,需要包括以下内容:1. 二叉搜索树的基本操作(插入、删除、查找节点)2. 平衡二叉树的定义和性质3. AVL树的实现方法和性质4. 红黑树的实现方法和性质5. 应用:平衡二叉树的应用第三步:课程实践在学习以上内容后,可以进行一些课程实践。

比如,可以通过实现一个平衡二叉树来巩固和深化对平衡树的理解。

也可以通过实现某个应用,如在平衡二叉树上实现字典功能等。

这样可以让学生更加深入地了解平衡树的实现和应用。

第四步:总结最后一步是总结课程的收获和体会。

学生可以总结自己在课程中所学到的知识和技能,以及对平衡二叉树的理解和应用。

对于老师而言,也应该对课程进行反思,总结哪些方面可以进一步改进,如何更好地帮助学生掌握平衡二叉树的概念和实现方法。

总之,平衡二叉树是一种非常重要的数据结构,学习平衡二叉树不仅可以提高编程能力,也可以帮助我们更好地理解和应用其他的数据结构。

通过以上步骤的课程设计,可以更加深入地学习和掌握平衡二叉树,并且在实践中加深对平衡树的理解和应用。

二叉排序树与二叉平衡树的实现

二叉排序树与二叉平衡树的实现

实验一二叉排序树与平衡二叉树的实现一:题目内容1.问题描述分别采用二叉链表和顺序表作存储结构,实现对二叉排序树或平衡二叉树的操作。

2.基本要求(1)用二叉链表作存储结构实现二叉排序树。

1)构建二叉排序树:以回车符(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序树T;2)对二叉排序树T作中序遍历,输出结果;3)计算二叉排序树T查找成功的平均查找长度,输出结果;4)删除元素:输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则,输出信息“无x”;5)插入元素:输入元素x,查找二叉排序树T,若存在含x的结点,则输出信息“x 已存在”,否则插入该元素,并作中序遍历(执行操作2);2)用顺序表(一维数组)作存储结构----静态链表1)构建二叉排序树:以回车符(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序树T;2)对二叉排序树T作中序遍历,输出结果;3)计算二叉排序树T查找成功的平均查找长度,输出结果;4)删除元素:输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则,输出信息“无x”;5)插入元素:输入元素x,查找二叉排序树T,若存在含x的结点,则输出信息“x 已存在”,否则插入该元素,并作中序遍历(执行操作2);(3)*用二叉链表作存储结构实平衡的二叉排序树。

1)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT;2)计算平衡的二叉排序树BT的平均查找长度,输出结果。

*该功能可选做。

二:问题分析:这是一个有关二叉树的基本操作的问题。

涉及到二叉树的生成,遍历,查找,以及节点的插入和删除操作。

三:程序设计#include "stdio.h"#include "iostream"using namespace std;int i=0;int n=0;typedef struct TreeNode{int key;struct TreeNode *left;struct TreeNode *right;}treeNode;class BiSortTree{public:BiSortTree(void);~BiSortTree();void desplayTree(void);void insertTree(int key);void deleteTree(int key);treeNode* searchTree(int key);private:treeNode* buildTree(treeNode* head,int number);treeNode* search(treeNode* head ,int key);treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p);treeNode* BiSortTree::searchMinRight(treeNode* head);void showTree(treeNode* head);void destroyTree(treeNode* head);treeNode *Head;};BiSortTree::BiSortTree(){cout<<" 建立一棵二叉排序树,请输入你要建树的所有数(以/n作为结束标志!): "<<endl;Head=NULL;int number;cin>>number;while(number!=-1){Head=buildTree(Head,number);n++;cin>>number;}}treeNode* BiSortTree::buildTree(treeNode *head,int number) //head 为父结点{treeNode *p;p=new treeNode;p->key=number;p->left=p->right=NULL;if(head==NULL){i++;return p;}else{if(p->key<head->key){head->left=buildTree(head->left,number);i++;}else{head->right=buildTree(head->right,number);i++;}return head;}}void BiSortTree::insertTree(int key){Head=buildTree(Head,key);}treeNode* BiSortTree::searchTree(int key){return search(Head,key);}treeNode* BiSortTree::search(treeNode* head ,int key) {if(head==NULL)return NULL;if(head->key==key)return head;else{if(key<head->key )return search(head->left,key);elsereturn search(head->right,key);}}void BiSortTree::deleteTree(int key){treeNode *p;p=NULL;p=search(Head,key);if(p==NULL){cout<<"无"<<key<<endl;}else{treeNode* parent;parent=searchParent(Head,p);if(p->left==NULL&&p->right==NULL) {if(parent->left==p){parent->left=NULL;}else{parent->right=NULL;}}else{if(p->right==NULL){if(parent->left==p){parent->left=p->left ;}else{parent->right=p->left;}}else{treeNode *rightMinSon, *secondParent;rightMinSon=searchMinRight(p->right);secondParent=searchParent(p->right ,rightMinSon);secondParent->left=rightMinSon->right;if(p->right==rightMinSon){p->right=rightMinSon->right ;}p->key=rightMinSon->key ;}}}}treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p){if(head->left==p||head->right==p||head==p||head==NULL) return head;else{if(p->key<head->key)return searchParent(head->left,p);elsereturn searchParent(head->right,p);}}treeNode* BiSortTree::searchMinRight(treeNode* head){if(head->left ==NULL||head==NULL){return head;}else{return searchMinRight(head->left);}}void BiSortTree::desplayTree(void){cout<<"按中序遍历输出二叉树:"<<endl;showTree(Head);cout<<endl;}void BiSortTree::showTree(treeNode* Head) {if(Head!=NULL){showTree(Head->left );cout<<Head->key<<' ';showTree(Head->right) ;}}BiSortTree::~BiSortTree(){cout<<"已经消除了一棵树"<<endl;destroyTree(Head);}void BiSortTree::destroyTree(treeNode* head) {if(head!=NULL){destroyTree(head->left );destroyTree(head->right );delete head;}}int main(){BiSortTree tree;int number,set;tree.desplayTree();cout<<"查找成功的平均查找长度是:"<<endl;cout<<(float)i/n<<endl;cout<<"操作如下所示:"<<endl;cout<<"插入:1 删除:2"<<endl;while(cin>>set){if(set==2){cout<<"请输入你要删除的数: "<<endl;cin>>number;tree.deleteTree(number);cout<<"删除"<<number<<"后的树变为:"<<endl;tree.desplayTree();}else if(set==1){ cout<<"请输入你要插入的数"<<endl;cin>>number;tree.insertTree(number);cout<<"插入"<<number<<"后的树变为:"<<endl;tree.desplayTree();}}}四:结果。

《数据结构》课程设计--二叉排序树调整为平衡二叉树

《数据结构》课程设计--二叉排序树调整为平衡二叉树

《数据结构》课程设计--二叉排序树调整为平衡二叉树2013-2014学年第一学期《数据结构》课程设计报告题目:二叉排序树调整为平衡二叉树专业:网络工程班级:二姓名:汪杰指导教师:刘义红成绩:计算机与信息工程系2013年 1 月 2日目录1、问题描述………………………………………2、设计思路(数学模型的选择) ……………3、二叉排序树和平衡二叉树定义…………………………4、程序清单……………………………5.程序功能说明……………………………5.运行与调试分析………………………6.总结…………………………………1.问题描述输入带排序序列生成二叉排序树,并调整使其变为平衡二叉树,运行并进行调试。

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

具体步骤如下:⑴每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点;⑵若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;⑶判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整;⑷如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;3.二叉排序树和平衡二叉树定义二叉排序树二叉排序树(Binary Sort Tree)又称二叉查找树。

数据结构课程设计:平衡二叉树

数据结构课程设计:平衡二叉树

数据结构课程设计:平衡二叉树目录1课程设计的目的和内容 (1)课程设计目的................................................... 1 1.11.2主要内容 (1)2课程设计分析 (2)2.1程序的目的和要求 (2)2.2程序的主要数据和功能模块 (2)3详细设计 (5)3. 1程序主要功能模块的伪代码算法 (5)3. 2程序主要流程图 (8)4测试数据与测试结果 (9) (5)程序的使用和改进 (14)5. 1用户使用说明 (14)5.2程序的改进 (14)6课程设计小结......................................................... 15 7参考文献.. (15)1平衡二叉树1课程设讣的LI的和内容1.1课程设计目的复习二义树的三义链表存储结构和遍历方法。

掌握二义排序树的特点和生成方法。

掌握平衡二义树四种不平衡形态的判定和旋转为平衡的方法。

1.2主要内容(1)输入结点数据,构造二义树的结点,按二义排序树的规则插入该结点到三义链表中;(2)通过插入函数InsertAVL(BSTNode* &T, int key)插入新结点到二义树中,并递归调用插入函数本身,直到正确插入到二义树中,并返回上次递归,每返回上次递归一次同时判断其平衡度bf,找到最小不平衡树的根结点Po(3)判断最小不平衡树的平衡因子(bf)的值,若bf>l,则调用左平衡函数LeftBalanceO ,若bf<~l,则调用右平衡函RightBalance (),再判断根结点p的左(右)孩子的平衡因子(共有LL型、LR型、RR型、RL型四种),然后判定得到的不平衡形态调用不同的旋转函数即可将其重新调整为平衡二义树;(4)重复步骤(1) (2) (3),直到所有结点都插入到该平衡二义树中为止;(5)输出该二义树的前序(或者后序)序列和中序序列,手工恢复出该二义树,检验其是否为平衡二义树;并验证其中序序列的有序性。

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

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

课程设计(论文)任务书软件学院软件+道路与铁道专业2班一、课程设计(论文)题目二叉排序树的实现二、课程设计(论文)工作自 2012年 12月 17日起至2012年 12月 23日止。

三、课程设计(论文) 地址: 15#520四、课程设计(论文)内容要求:1.本课程设计的目的(1) (1)要求学生达到熟练把握C 语言的大体知识和技术;(2) 大体把握面向对象程序设计的大体思路和方式;(3) 能够利用所学的大体知识和技术,解决简单的程序设计问题。

2.课程设计的任务及要求1)大体要求:(1)(1)要求利用TC 的编程思想来完成系统的设计;(2)要求在设计的进程中,成立清楚的结构体层次;(3)在系统的设计中,至少要做到大体治理要求。

(4)学生必需认真阅读《数据结构》课程设计方案,认真主动完成课设的要求。

有问题及时主动通过各类方式与教师联系沟通。

2)创新要求:在大体要求达到后,可进行创新设计,如改善算法性能、友好的人机界面等。

3)课程设计论文编写要求(1)要依照书稿的规格打印与写课程设计论文(2)论文包括目录、功能描述、设计思路、具体实现、运行调试与分析讨论、设计体会与小结、参考文献、附录(源代码)等(3)课程设计论文装订按学校的统一要求完成4)答辩与评分标准:(1)考勤与学习态度:20分;(2)设计思路:20分;(3)代码实现:20分;(4)调试与分析:20分;(5)回答下列问题:10分;(6)论文标准性:10分。

5)参考文献[1]严蔚敏,吴伟民,《数据结构》北京清华大学出版社[2]谭浩强,《C++程序设计》北京清华大学出版社[3]谭锋,章伟聪,《Visual c++程序设计实训教程》北京科学出版社6)课程设计进度安排1.预备时期(2学时):选择设计题目、了解设计目的要求、查阅相关资料2.程序模块设计分析时期(2学时):程序整体设计、详细设计3.代码编写调试时期(6学时):程序模块代码编写、调试、测试4.撰写课程设计论文时期(2学时):总结课程设计任务和设计内容,撰写课程设计论文学生签名:谢岳松2012年12 月24 日课程设计(论文)评审意见(1)考勤与态度(20分):优()、良()、中()、一样()、差();(2)设计思路(20分):优()、良()、中()、一样()、差();(3)代码实现(20分):优()、良()、中()、一样()、差();(4)调试与分析(20分):优()、良()、中()、一样()、差();(5)回答下列问题(10分):优()、良()、中()、一样()、差();(6)论文标准性(10分):优()、良()、中()、一样()、差();评阅人:职称:讲师2012 年12月26日绪论 ............................................................................... - 1 -一、功能描述............................................................ - 2 -二、设计思路............................................................ - 2 -三、具体实现............................................................ - 6 -四、运行调试及结果分析...................................... - 14 -五、设计体会与小结.............................................. - 16 -六、参考文献 (17)七、附录(核心代码) (17)数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。

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

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

课程设计课程名称数据构造课程设计题目名称二叉排序树的实现学院应用数学学院专业班级学号学生XX指导教师2013 年12 月26 日1.设计任务1)实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进展先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、XX、成绩3项),比照查找效率,并说明为什么二叉排序树效率高〔或者低〕。

2. 函数模块:2.1.主函数main模块功能1.通过bstree CreatTree()操作建立二叉排序树。

2.在二叉排序树t中通过操作bstree InsertBST(bstree t,intkey,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 pare()对数组和二叉排序树的查找效率进展比拟比拟。

2.2创立二叉排序树CreatTree模块从键盘中输入关键字及记录,并同时调用插入函数并不断进展插入。

最后,返回根节点T。

2.3删除模块:二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。

假设二叉排序树上删除节点为*p〔指向节点的指针为p〕,其双亲节点为*f〔节点指针为f〕。

假设*p节点为叶子节点,那么即左右均为空树,由于删去叶子节点不破坏整棵树的构造,那么只需修改其双亲节点的指针即可;假设*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;假设*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱〔或直接后继〕替代*p,然后再从二叉排序树中删去它的直接前驱〔或直接后继〕。

C#实现二叉排序与平衡二叉树

C#实现二叉排序与平衡二叉树

本科生数据结构实验报告封面(2012至2012学年度第二学期)题目C#实现二叉排序与平衡二叉树科目数据结构姓名李艳玫学号201175040112班级 11级地理信息系统实验成绩:授课教师签字:C#实现二叉排序与平衡二叉树1.根据所给一组数如何构造一棵二叉树。

一棵二叉排序树满足二叉树的性质:1>若他的左子树非空,则它的左子树上记录的所有结点的值都小于根记录的值。

2>若他的右子树非空,则它的右子树上记录的所有结点的值都大于根记录的值。

3>左右子树本身又是一颗二叉树。

根据给定的一组数如:{ 50, 30, 20, 10, 60, 70 }构造二叉树的算法:首先取到50作为根节点,然后在取到30,用30和50比较,发现30小于50,则30为50的左孩子,再取20,20又小于30,固又为30 的左孩子,取10,做20的左孩子,60做50的右孩子,70做60的右孩子。

这样一棵二叉树就构造完了。

如下:5030 6020 7010下面我们就实现该算法:首先我们有一个数,我们先看是否根节点为NULL:如果为空,则该节点即为根节点,并使他的左右孩子均为NULL,既有:public BsTrav Insert (int X,BsTrav T) //函数if(T==null){T.Element=X; T.Left=T->Right= null;}如果头结点不为空,则和头结点进行比较,如大则为右孩子,否则为左孩子。

if(X<T.Element) T.Left = Insert(X,T.eft);if(X>T.Element) T.Right = Insert(X,T.Right);最后在返回T即可。

2.平衡二叉树平衡二叉树的特点:1>他的左子树和右子树都是平衡二叉树。

2>左子树和右子树的高度差不超过2.我们先来解决第一个问题:如何求一棵二叉树的高度。

我们定义:当前结点的高度、是取左右孩子高度最大值再加1,所以对一下的结点,有:我们在来计算高度差:30(1)(1) 12 57 (1)(0) (1) 23 (1) 96(0) 18 (1) 75(0)83下面我们设计来计算高度差:就是在比较大小的过程。

二叉排序树与平衡二叉排序树基本操作的实现 文本文档

二叉排序树与平衡二叉排序树基本操作的实现 文本文档

10 设计说明书(论文)质量 30 综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11 创新 10 对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名: 年 月 日
摘要及关键字
本程序中的数据采用“树形结构”作为其数据结构。具体采用的是“二叉排序树”。
1.2.5 平衡二叉树( AVL树 )
①平衡二叉树(Balanced Binary Tree)是指树中任一结点的左右子树的高度大致相同。 ②任一结点的左右子树的高度均相同(如满二叉树),则二叉树是完全平衡的。通常,只要二叉树的高度为O(1gn),就可看作是平衡的。 ③平衡的二叉排序树指满足BST性质的平衡二叉树。 ④AVL树中任一结点的左、右子树的高度之差的绝对值不超过1。在最坏情况下,n个结点的AVL树的高度约为1.44lgn。而完全平衡的二叉树高度约为lgn,AVL树是最接近最优的。
1.2.4平均查找长度…………………………………………………………… 6
1.2.5平均二叉树(AVL树)…………………………………………………… 6
1.2.6平衡因子………………………………………………………………… 7
1.2.7平衡二叉树的调整方法…………………………………………………… 7
攀枝花学院本科学生课程设计任务书
题 目 二叉排序树与平衡二叉树的实现
1、课程设计的目的
使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
3) 使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。

二叉平衡排序树

二叉平衡排序树

《数据结构》课程设计报告专业:班级:姓名:指导教师:学号:2010年 7 月 5 日二叉平衡排序树一、课程设计内容问题描述:从一棵空树开始创建,在创建过程中,保证树的有序性,同时还要针对树的平衡性做些调整。

最终要把创建好的二叉排序树转换为二叉平衡排序树。

基本要求:1.创建(插入、调整、改组)2.输出二、主要算法说明1、.主要数据结构定义typedef struct node node;struct node{node* parent;node* left;node* right;int balance; //左右子树高度之差int key;};2、主要函数说明int searchNode(int key, node* root, node** parent) :按key查找结点node* minNode(node* root) :树root的最小结点node* maxNode(node* root) :树root的最大结点node* preNode(node* target) :求前驱结点node* nextNode(node* target) :求后继结点node* adjustAVL(node* root, node* parent, node* child) :调整,保证二叉树的平衡性node* insertNode(int key, node* root) :插入node* deleteNode(int key, node* root) :删除node* createAVL(int *data, int size) :建造新的二叉树void interordertraverse(node* root) :中序遍历void preordertraverse(node* root) :先序遍历3、二叉排序树的插入和删除a. 二叉排序树的插入在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

攀枝花学院本科学生课程设计任务书注:任务书由指导教师填写。

摘要及关键字本程序中的数据采用“树形结构”作为其数据结构。

具体采用的是“二叉排序树”。

二叉排序树(又称二叉查找树):(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 算法流程图建立二叉树流程图:主程序流程图:中序遍历流程图:删除节点流程图: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<stdio.h>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(key<t->data) 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(key<p->data) 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)。

相关文档
最新文档