欢迎来到天天文库
浏览记录
ID:39693378
大小:224.01 KB
页数:18页
时间:2019-07-09
《数据结构课程设计- 平衡二叉树操作》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、课程设计报告课程名称数据结构课程设计题目平衡二叉树操作指导教师设计起止日2010-5-16学院计算机学院专业软件工程学生姓名班级/学号------------成绩_________________—18—一.需求分析1、建立平衡二叉树并进行创建、增加、删除、调平等操作。2、设计一个实现平衡二叉树的程序,可进行创建、增加、删除、调平等操作,实现动态的输入数据,实时的输出该树结构。3、测试数据:自选数据二.概要设计平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下
2、,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤如下: ⑴每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点; ⑵若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点; ⑶判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整; ⑷如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或RL型,则需应用扁担
3、原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突; ⑸计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。三.详细设计树的内部变量typedefstructBTNode{—18—intdata;intbf;//平衡因子structBTNode*lchild,*rchild;//左、右孩子}BTNode,*BTree;调平二叉树(左右调平方式大体雷同,之具体写出其中一种调平方式)if(插入元素与
4、当前根元素相等){printf("已存在相同关键字的结点");}if(插入元素小于当前根元素)){if(插入新结点不成功)return0;if(插入成功)switch(查看根的平衡因子){case+1:进行左平衡处理;{检查*T的左子树的平衡度,并作相应平衡处理{case+1:令根及其左孩子的平衡因子为0;做右平衡处理;{BTreelc;lc指向的结点左子树根结点;rc的右子树挂接为结点的左子树;lc的右孩子为原结点;原结点指向新的结点lc;}break;case-1:rd指向*T的左孩子的右子树根switch(查看右孩子平衡因子){case+1:根的平衡因子为-1;根左孩子的
5、平衡因子为0;break;case0:令根和根左孩子的平衡因子为0;break;case-1:—18—根平衡因子为0;根左孩子平衡因子为1;break;}根右孩子的平衡因子为0;对*T的左子树作左旋平衡处理;对*T作右旋平衡处理;}break;case0:令根的平衡因子为+1;break;case-1:令根的平衡因子为-1;break;}}四.调试分析在进行对插入新结点并调平时由于利用的是普通的插入方法进行LL、LR、RL、RR型的转换,使得在调试时经常没有更改内部变量的值,导致编译出错。对于在空树情况下删除结点的考虑,是在后期的调试检验过程中发现的。在没有更改代码前,如果按此操作
6、,程序就会崩溃。原因就是在删除函数中虽然考虑到了空树的情况,但是在输出树的函数中没有加入空树的考虑而只是在创建树函数中加入了if…else…的判断。经过反复的检查,发现可以直接在输出函数中加入判断而不必再其他位置判断,并且调试成功。五.使用说明和测试结果测试数据:创建二叉树—18—增加二叉树直接创建平衡二叉树—18—平衡二叉树加入新节点并调平删除结点—18—六.心得体会了解了建立树的方法;学会了利用二分法建立树结构。、;学习到了二叉树的调平方法;学会了向一个已知树插入或删除结点的方法。七.附录源代码#include"stdafx.h"#include#includ
7、e#defineEQ(a,b)((a)==(b))#defineLT(a,b)((a)<(b))#defineLQ(a,b)((a)>(b))#defineLH+1//左高#defineEH0//等高#defineRH-1//右高typedefstructBTNode{intdata;intbf;//平衡因子structBTNode*lchild,*rchild;//左、右孩子}BTNode,*BTree;—18—/*需要的函数声明*/voidRi
此文档下载收益归作者所有