数据结构大作业(平衡二叉树)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学与计算机学院计算机系数据结构程序设计报告
平衡二叉树
学生姓名:* *
学好:1004681028
班级:计算机系102
指导老师:* * *
报告日期:2011/6/26
目录
1.平衡二叉树 (3)
1.1平衡二叉树的定义 (3)
1.2平衡二叉树的构造 (3)
1.3平衡二叉树查找的分析 (3)
2.程序功能 (3)
3.程序结构类型 (3)
4.程序函数 (4)
5.算法思想 (5)
5.1 判断二叉树的旋转方法 (5)
5.2 平衡旋转处理 (5)
5.3 在平衡二叉树中插入元素 (5)
5.4 在平衡二叉树中删除元素 (5)
5.5 输出平衡二叉树树形 (5)
5.6 销毁平衡二叉树 (5)
6.程序设计总结 (9)
7.结束语 (10)
8.附录:程序清单 (10)
1.平衡二叉树
1.1平衡二叉树的定义
平衡二叉树(Balanced Binary Tree或Height-Balanced Tree)又称AVL树。它或者是一颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树上结点的平衡因子BF(Balanced Factor)定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子之可能是-1、0和1。只要二
叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。
1.2平衡二叉树的构造
构造一颗平衡二叉树的过程就是将一颗空树从根结点起,逐步插入或删除结点并不断对此树进行平衡化。在构造平衡二叉树的过程中有插入和删除两大操作。在树中进行插入和删除操作都可使树失去平衡,然而要让二叉排序树由不平衡转化为平衡,操作就是对二叉树进行旋转,旋转的过程将在算法思想中详细介绍。
1.3平衡二叉树查找的分析
在平衡二叉树上进行查找的过程和二叉排序树相同,因此,在查找过程中和给定值进行比较的关键字个数不超过树的深度。因此,在平衡二叉树上进行查找的时间复杂度为O(log n).
2.程序功能
本程序的功能就是将二叉排序树转变为平衡二叉树,其操作有:创建二叉树、插入数据、删除数据、输出、销毁二叉树和退出。
3.程序结构类型
在本程序中主要用到两个结构类型:结构体和队列。二叉树是链式存储结构,故用结构体来定义其结构。队列是用作输出二叉树的树形(层序输出)。
4.程序函数
4.1 main()函数:
(1)函数原形:void main()
(2)功能:显示总菜单,调用子函数
4.2 Create()函数:
(1)函数原形:void Create(BSTree &T)
(2)功能:实现二叉树的创建
4.3 Insert()函数:
(1)函数原形:void Insert(BSTree &T)
(2)功能:实现在二叉树中插入数据
4.4 InsertA VL()函数:
(1)函数原形:int InsertAVL(BSTree &T,int e,int &taller)
(2)功能:插入结点,并将二叉树平衡化
4.5 DeleteMenu()函数:
(1)函数原形:void DeleteMenu(BSTree &T)
(2)功能:实现在二叉树中删除数据
4.6 DeleteA VL()函数:
(1)函数原形:int DeleteA VL(BSTree &T,int e,int &shorter)
(2)功能:删除结点,并将二叉树平衡化
4.7Delete()函数:
(1)函数原形:int Delete(BSTree &p)
(2)功能:实现删除结点
4.8 Search()函数:
(1)函数原形:void Search(BSTree &T,int e,int key)
(2)功能:在树中查找和关键字相等的结点
4.9 R_Rotate()函数:
(1)函数原形:void R_Rotate(BSTree &p)
(2)功能:对以*p为根结点的子树进行右旋平衡处理
4.10 L_Rotate()函数:
(1)函数原形:void L_Rotate(BSTree &p)
(2)功能:对以*p为根结点的子树进行左旋平衡处理
4.11 RightBalance()函数:
(1)函数原形:int RightBalance(BSTree &T)
(2)功能:对以指针T所指结点为根的二叉树作右平衡旋转处理4.12 LeftBalance()函数:
(1)函数原形:int LeftBalance(BSTree &T)
(2)功能:对以指针T所指结点为根的二叉树作左平衡旋转处理4.13 Output()函数:
(1)函数原形:void Output(BSTree T)
(2)功能:将二叉树按中序和层序输出
4.14 Inordertraverse()函数:
(1)函数原形:void Inordertraverse(BSTree T)
(2)功能:将二叉树按中序输出
4.15 Depth()函数:
(1)函数原形:void Depth(BSTree p,int n,int &num)
(2)功能:求二叉树的深度
4.16 Levelordertraverse()函数:
(1)函数原形:int Levelordertraverse(Stack &Q)
(2)功能:将二叉树按层序输出
4.17 Initstack()函数:
(1)函数原形:int Initstack(Stack &Q)
(2)功能:构造一个空队列
4.18 Push()函数:
(1)函数原形:int Push(Stack &Q,BSTree e)
(2)功能:插入元素e为新的队尾元素
4.19 Pop()函数:
(1)函数原形:int Pop(Stack &Q,BSTree &q)
(2)功能:删除对头元素
4.20 Destroy()函数:
(1)函数原形:void Destroy(BSTree &T)
(2)功能:将队列销毁
5.算法思想
5.1 判断二叉树的旋转方法
在一颗平衡二叉树中插入或删除一个结点后,若二叉树失去平衡,则需将二叉树进行平衡化处理,简而言之,就是对不平衡的二叉树进行旋转处理。假设在二叉排序树中插入或删除结点而失去平衡的最小子树根结点的指针为T(即T是离插入或删除结点最近,且平衡因子绝对值超过1的祖先结点),指针p指向结点T的左子树的根结点,指针q指向结点T的右子树的根结点,则判断方法如下:
(1)若结点T的平衡因子为2,结点p的平衡因子为1,则需对结点T进行单向右旋平衡处理;
(2)若结点T的平衡因子为-2,结点p的平衡因子为-1,则需对结点T进行单向左旋平衡处理;
(3)若结点T的平衡因子为2,结点p的平衡因子为-1,则需先对结点p进行单向左旋平衡处理,再对结点T进行单向右旋平衡处理,将这两步简称为对结点T进行双向旋转(先左后右) 平衡处理;
(4) 若结点T的平衡因子为-2,结点p的平衡因子为1,则需先对结点p进行单向右旋平衡处理,再对结点T进行单向左旋平衡处理,将这两步简称为对结点T进行双向旋转(先右后左) 平衡处理;
5.2 平衡旋转处理
假设由于在二叉排序树上插入或删除结点而失去平衡的最小子树根结点的指针为T(即T为里插入结点最近,且平衡因子绝对值超过1的祖先结点),则失去平衡后进行平衡处理有如下4种情况:
(1)单向右旋平衡处理:若指针p指向以*T为根的左子树的根结点,将*p的右子树作
为*T的左子树,再将以*T为根的树作为*p的右子树,如图(a)所示。