版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 树和二叉树,树 二叉树 以结点类为基础的二叉树设计 二叉树类 二叉树的分步遍历 线索二叉树 哈夫曼树 树与二叉树的转换 树的遍历,主要知识点,7.1 树,1.树的定义,树是由n(n0)个结点组成的有限集合T。n=0的树称为空树;对n0的树,有:(1)仅有一个特殊的结点称为根结点,根结点没有前驱结点;(2)当n1时,除根结点外其余的结点分为m(m0)个互不相交的有限集合T1,T2,Tm,其中每个集合Ti本身又是一棵结构和树类似的子树。,注:树的定义具有递归性,即“树中还有树”。,若干术语,结点:由数据元素和构造数据元素之 间关系的指针组成,结点的度:结点所拥有的子树的个数,叶结点:度为0
2、的结点,也称作 终端结点,分支结点:度不为0的结点,孩子结点:树中一个结点的子树的根结点,双亲结点:若树中某结点有孩子结点,则这个结点就 称作它的孩子结点的双亲结点,兄弟结点:具有相同的双亲结点的结点,树的度:树中所有结点的度的最大值,结点的层次:从根结点到树中某结点所经路径上的分支数,树的深度:树中所有结点的层次的最大值,无序树:树中任意一个结点的各孩子结点之间的次序 构成无关紧要的树,有序树:树中任意一个结点的各孩子结点有严格排列 次序的树,森林:m(m0)棵树的集合,2.树的表示方法,(1)直观表示法,(2)形式化表示法,(3)凹入表示法,3.树的抽象数据类型,数据集合: 树的结点集合,
3、每个结点由数据元素和构造数 据元素之间关系的指针组成。 操作集合: (1)创建树MakeTree(T) (2)撤消树DestroyTree(T) (3)查找树中当前结点的双亲结点Parent(T,curr) (4)查找树中当前结点的左孩子结点LeftChild(T,curr) (5)查找树中当前结点的右兄弟结点RightSibling(T,curr) (6)遍历树Traverse(T,Visit( ),4.树的存储结构,树的结点之间的逻辑关系主要有双亲-孩子关系,兄弟关系。因此,从结点之间的逻辑关系分,树的存储结构主要有:双亲表示法、孩子表示法、双亲孩子表示法和孩子兄弟表示法四种组合。,(1)
4、双亲表示法,(a)一棵树,(b)仿真指针的双亲表示法存储结构,树及其使用仿真指针的双亲表示法,(2)孩子表示法,双亲孩子表示法,(3)双亲孩子表示法,(4)孩子兄弟表示法,常规指针的孩子兄弟表示法,7.2 二叉树,一、二叉树:是n(n0)个结点的有限集合。n=0的树称为空二叉树;n0的二叉树由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成 。 逻辑结构: 一对二(1:2) 基本特征: 每个结点最多只有两棵子树(不存在度大于2的结点); 左子树和右子树次序不能颠倒。所以下面是两棵不同的树,1.二叉树的定义,二、满二叉树:在一棵二叉树中,如果所有分支结点都存在左 子树和右子树,并
5、且所有叶子结点都在同一层上,这样的 二叉树称为满二叉树。 三、完全二叉树:如果一棵深度为k,有n个结点的二叉树中各 结点能够与深度为k的顺序编号的满二叉树从1到n标号的 结点相对应的二叉树称为完全二叉树。如下图所示,(a)满二叉树,(b)完全二叉树,数据集合:二叉树的结点集合,每个结点由数据元素和构造数据元素之间关系的指针组成。 操作集合: (1)创建二叉树 MakeTree(T) (2)撤消二叉树 DestroyTree(T) (3)左插入结点 InsertLeftNode(curr,x) (4)右插入结点 InsertRightNode(curr,x) (5)左删除子树 DeleteLef
6、tTree(curr) (6)右删除子树 DeleteRightTree(curr) (7)遍历二叉树 Traverse(T,Visit(),2.二叉树抽象数据类型,3.二叉树的性质,性质1:在一棵非空二叉树的第i层上至多有2i个结点(i0)。,性质2:深度为k的二叉树至多有2k+1-1个结点(k-1)。,性质3: 具有n个结点的完全二叉树的深度k为不超过log2(n+1)-1的最大整数。,证明:根据性质2,对于有n个接点的深度为k的完全二叉树有 2k-1n2k+1-1,移项,有 2kn+12k+1 对不等式求对数,有klog2(n+1)k+1,因为k必须是整数,所以k=log2(n+1)-1
7、,性质4:对于一棵有n个结点的完全二叉树,按照从上至下和从左至右的顺序对所有结点从0开始顺序编号,则对于序号为i的结点(0in),有: (1)如果i0,则其双亲是结点(i-1)/2(“/”表示整除) ;如果i=0,则结点I是根结点,无双亲。 (2)如果2i+1n ,其左孩子是结点2i+1;如果2i+1n,则结点i无左孩子。 (3)如果2i2n,其右孩子是结点2i2;如果2i2n,则结点i无右孩子。,二叉树的存储结构主要有三种:顺序存储结构、链式存储结 构和仿真指针存储结构。 (1) 二叉树的顺序存储结构 完全二叉树的结点可按从上至下和从左至右的次序存储在一维数组中,其结点之间的关系可由公式计算
8、得到,这就是二叉树的顺序存储结构。下面两棵树在数组中的存储结构分别为:,4.二叉树的存储结构,对于一般的非完全二叉树显然不能直接使用二叉树的顺序存储结构。可以首先在非完全二叉树中增添一些并不存在的空结点使之变成完全二叉树的形态,然后再用顺序存储结构存储。,(a)一般二叉树,(b)完全二叉树形态,(c) 在数组中的存储形式,(2) 二叉树的链式存储结构 二叉树的链式存储结构是用指针建立二叉树中结点之间的关系。二叉树最常用的的链式存储结构是二叉链。二叉链存储结构的每个结点包含三个域,分别是数据域data、左孩子指针域leftChild和右孩子指针域rightChild。二叉链存储结构中每个结点的图
9、示结构为:,二叉链存储结构的二叉树也有不带头结点和带头结点两种。带头结点的二叉链存储结构的二叉树见下图(b),不带头结点的二叉链存储结构的二叉树如下图(a)所示。,图7-10 二叉链存储结构的二叉树,(a)不带头结点的二叉树,(b)带头结点的二叉树,(3)二叉树的仿真指针 二叉树的仿真指针存储结构是用数组存储二叉树中的结点,数组中每个结点除数据元素域外,再增加仿真指针域用于仿真常规指针建立二叉树中结点之间的关系。,二叉树的仿真二叉链存储结构,7.3 以结点类为基础的二叉树设计,二叉树的实现有两种基本方法:一种方法是首先设计二叉树结点类,然后在二叉树结点类的基础上,用结点类的外部函数实现二叉树的
10、操作;另一种方法是在二叉树结点类的基础上,再设计二叉树类。,1.二叉树的结点类,模板形式的二叉树结点类定义和实现代码如下:,template class BiTreeNode private: BiTreeNode *leftChild;/左子树指针 BiTreeNode *rightChild;/右子树指针 public: T data; /数据域 BiTreeNode():leftChild(NULL), rightChild(NULL) BiTreeNode(T item, BiTreeNode *left = NULL, BiTreeNode *right = NULL): data(
11、item), leftChild(left), rightChild(right) BiTreeNode(),BiTreeNode* 设计说明: (1)成员变量通常设计成私有访问权限,但考虑到外部函数要频繁使用结点类中的成员变量,所以这里成员变量data设计成公有访问权限。 (2)二叉树也有带头结点(或称根结点)和不带头结点两种情况。这里设计了两个构造函数,第一个可用于带头结点结构中头结点对象的定义,第二个用于常规结点对象的定义。 (3)访问指针域的成员函数Left ()和Right()的返回值类型设计为指针的引用类型是十分必要的,引用类型变量意味着相应的变量是同一个变量,这使得这两个函数不仅
12、可以位于赋值号的左边,而且还可以位于赋值号的右边。,由结点构造二叉树的基本函数: template BiTreeNode *GetTreeNode(const T item, BiTreeNode *left = NULL, BiTreeNode *right = NULL) BiTreeNode *p; p = new BiTreeNode (item, left, right); return p; ,2.二叉树的遍历,(1)二叉树遍历的基本方法,从二叉树的定义知,一棵二叉树由三部分组成:根结点、左子树和右子树。若规定D,L,R分别代表“访问根结点”、“遍历根结点的左子树”和“遍历根结点的
13、右子树”,根据遍历算法对访问根结点处理的位置,称下面三种遍历算法分别为前序遍历(DLR)、中序遍历(LDR)和后序遍历(LRD)。,前序遍历(DLR)递归算法为: 若二叉树为空则算法结束;否则: (1)访问根结点; (2)前序遍历根结点的左子树; (3)前序遍历根结点的右子树。,中序遍历(LDR)递归算法为: 若二叉树为空则算法结束;否则: (1)中序遍历根结点的左子树; (2)访问根结点; (3)中序遍历根结点的右子树。 后序遍历(LRD)递归算法为: 若二叉树为空则算法结束;否则: (1)后序遍历根结点的左子树; (2)后序遍历根结点的右子树; (3)访问根结点。,此外,二叉树还有层序遍历
14、。层序遍历的要求是:按二叉树的层序次序(即从根结点层至叶结点层),同一层中按先左子树再右子树的次序遍历二叉树。 它的特点是,在所有未被访问结点的集合中,排列在已访问结点集合中最前面结点的左子树的根结点将最先被访问,然后是该结点的右子树的根结点。这样,如果把已访问的结点放在一个队列中,那么,所有未被访问结点的访问次序就可以由存放在队列中的已访问结点的出队列次序决定。因此可以借助队列实现二叉树的层序遍历。,当对一个二叉树用一种特定的遍历方法来遍历时,其遍历序列一定是线性的,且是惟一的。,二叉树的层序遍历算法如下: (1)初始化设置一个队列; (2)把根结点指针入队列; (3)当队列非空时,循环执行
15、步骤(3.a)到步骤(3.c); (3.a)出队列取得一个结点指针,访问该结点; (3.b)若该结点的左子树非空,则将该结点的左子树指针入队列; (3.c)若该结点的右子树非空,则将该结点的右子树指针入队列; (4)结束。,(2)二叉树的遍历方法和二叉树的结构 二叉树是非线性结构,每个结点会有零个、一个或两个孩子结点,一个二叉树的遍历序列不能决定一棵二叉树,但某些不同的遍历序列组合可以惟一确定一棵二叉树。可以证明,给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一确定一棵二叉树的结构。,(3)二叉树遍历的实现 template void PreOrder(BiTreeNode *t, void
16、 Visit(T item) /使用Visit(item)函数前序遍历二叉树t if(t != NULL) Visit(t-data); PreOrder(t-Left(), Visit); PreOrder(t-Right(), Visit); 为了通用性,把访问操作设计成前序遍历二叉树函数的一个函数虚参 Visit()。,template void InOrder(BiTreeNode *t, void Visit(T item) /使用Visit(item)函数中序遍历二叉树t if(t != NULL) InOrder(t-Left(), Visit); Visit(t-data);
17、InOrder(t-Right(), Visit); template void PostOrder(BiTreeNode *t, void Visit(T item) /使用Visit(item)函数后序遍历二叉树t if(t != NULL) PostOrder(t-Left(), Visit); PostOrder(t-Right(), Visit); Visit(t-data); ,3.二叉树遍历的应用,(1)二叉树的撤消操作 在释放某个结点的存储空间前必须先释放该结点左孩子结点的存储空间和右孩子结点的存储空间,因此,二叉树撤消操作必须是后序遍历的具体应用。撤消操作函数实现如下: te
18、mplate void Destroy(BiTreeNode * ,(2) 打印二叉树 把二叉树逆时针旋转900C,按照二叉树的凹入表示法打印二叉树。可把此函数设计成递归函数。由于把二叉树逆时针旋转900C后,在屏幕上方的首先是右子树,然后是根结点,最后是左子树,所以打印二叉树算法是一种特殊的中序遍历算法。 template void PrintBiTree(BiTreeNode* ,(3)查找数据元素 在二叉树中查找数据元素操作的要求是:在bt为根结点指针的二叉树中查找数据元素x,若查找到数据元素x时返回该结点的指针;若查找不到数据元素x时返回空指针。 在二叉树bt中查找数据元素x函数可设计成先序遍历函数,此时查找结点的次序是:首先在根结点查找,然后在左子树查找,最后在右子树查找。但是,和常规递归算法不同的是,此函数当一个分支上的结点比较完仍未查找到数据元素x时,要返回到该结点的双亲结点处继续查找。因此,这是回溯算法的一个应用。 实现如下:,template BiTreeNode *Search(BiTreeNode *t, T x) BiTreeNode *p;if(t = NULL) return NULL;/空二叉树时的查找失败出口if(t-data = x) return t;/查找成功出口if(t-Left()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年幼儿园营养健康食堂创建细则
- 2026年康复科水疗与温热疗法居家应用指导
- 职业健康与职业病诊断与治疗协议
- 2026年志愿服务记录与证明出具办法
- 奶茶饮品店原料供应商选择合同
- 2026年医护人员消防安全知识培训手册
- 股骨干骨折患者心理康复技巧
- 肝素修饰超顺磁氧化铁纳米粒抗颞叶癫痫的多维度探究与机制解析
- 肝硬化患者生存质量多维剖析:评价体系与影响因素探究
- 肝癌治疗新探索:微波消融联合白介素-2的实验与临床研究
- 2025年海南省高考历史试卷真题(含答案及解析)
- 家谱编研作业指导书
- 完整版配电室维护保养方案
- 科普类文章演讲稿
- 课题申报书模板小学语文
- 索尼微单相机A7 II(ILCE-7M2)使用说明书
- 藏羌碉楼营造技艺传承-洞察及研究
- 新食品原料管理办法
- 金属非金属矿山企业安全风险分级管控与隐患排查治理双重预防机制建设规范
- (高清版)DB14∕T 3462-2025 井工煤矿人工智能视觉识别技术要求
- 行政应诉 培训 课件
评论
0/150
提交评论