平衡二叉树.docx
《平衡二叉树.docx》由会员分享,可在线阅读,更多相关《平衡二叉树.docx(11页珍藏版)》请在三一办公上搜索。
1、平衡二叉树结点的平衡因子balance balance该结点的右子树高度-该结点的左子树高度 对于AVL树:balance=1。即balance只能取-1,0,1三者之一。换言之,若一棵二叉树上任一结点的平衡因子的绝对值都不大于1,则该树是就平衡二叉树。 我们为图3-44的各结点加上平衡因子,得到图3-45。其中:图3-45c中的结点60的平衡因子为-2,故该二叉树不是平衡二叉树。 平衡二叉树的高度 我们能够获得一棵n个节点的AVL树的高度的范围。假设Nh是一棵高度为h的AVL树中最小的节点数。在最坏情况下,根节点的两个左右子树中一棵子树的高度是h-1,另一棵子树的高度是h-2,而且两棵子树都
2、是AVL树。因此有: 树的根结点,小写字母代表子树的深度。 平衡二叉树的删除 如果被删除的结点x最多只有一个孩子,那么问题比较简单,将结点x从树中删去。因为结点x最多有一个孩子,我们可以简单的把x的双亲结点中原来指向x的指针改指到这个孩子结点上。如果结点x没有孩子,即是一个叶结点,则删除x后x双亲结点的相应指针应置为NULL。如果被删结点x即有左孩子又有右孩子,则首先搜索x在中序遍历中的直接前驱y,把结点y的内容传送给结点x,现在问题转移到删除结点y。 下述二叉树中,哪一种满足性质:从任一结点出发到根的路径上所经过的结点序列按其关键字有序。 A.二叉排序树 B.赫夫曼树 C.AVL树 D.堆
3、本题主要考查了选项中出现的几种树的结构特点。对于选项A,根据二叉排序树的结构特点我们可以知道,二叉排序树的中序遍历结果是一个有序序列,而在中序遍历中,父结点并不总是出现在孩子结点的前面,故该选项不正确。例如我们用关键字5,2,3建立一棵二叉排序树,则从结点3出发到根的路径上所经过的结点序列为3,2,5,并不是一个有序的序列。对于选项B,赫夫曼树在后续的章节中会介绍,根据赫夫曼树的结构特点我们可以知道,在赫夫曼树中所有的关键字只出现在叶结点上,其非叶结点上并没有关键字值,显然不正确。对于选项C,AVL树其本质上也是一种二叉排序树,只不过是平衡化之后的二叉排序树,故该选项也是不正确的。例如我们用序
4、列5,1,8,6,9建立一棵AVL树,从结点6出发到根的路径上所经过的结点序列为6,8,5,也不是一个有序的序列。对于选项D,堆的概念我们会在堆排序中给大家介绍,根据建堆的过程,不断地把大者上浮,将小者筛选下去,最终得到的正是一个从任一结点出发到根的路径上所经过的结点序列按其关键字有序的树状结构,故D是正确的。 本题中的A和C同时出现,没有起到干扰的作用,因为AVL树和二叉排序树只是在平衡性上有区别,在结点的排列方式上没有区别。 D。 输入关键码序列为(16,3,7,11,9,26,18,14,15),据此建立平衡二叉树,给出插入和调整的具体过程。 本题主要考查如何从空树通过插入结点的方法建立
5、一棵平衡二叉树,由于插入结点而造成树的不平衡的时候,需要进行平衡化处理。 插入结点7后,结点16的平衡因子变为-2,需要对结点16,3,7进行LR型调整。插入结点11后,结点16的平衡因子变为-2,需要对结点16,11,9进行LL型调整。插入结点26后,结点7的平衡因子变为2,需要对结点7,11,16进行RR型调整。插入结点18后,结点16的平衡因子变为2,需要对结点16,26,18进行RL型调整。插入结点15后,结点16的平衡因子变为-2,需要对结点16,14,15进行LR型调整。 有一棵平衡二叉树的初始状态如图3-49a所示,请给出删除图中结点p后经调整得到的新的平衡二叉树。 本题主要考查
6、如何从一棵平衡二叉树中删除结点。由于结点p既有左孩子,又有右孩子,故在删除结点p的时候应该先找到中序遍历中结点p的直接前驱结点,即结点o,如图中b所示。然后用o取代p,删除o,如图中c所示。此时结点o的平衡度变为2,发生不平衡,故应对子树o,r,t进行RR型调整,如图中d所示。此时,结点m的平衡度变为-2,发生不平衡,故应对子树m,e,j进行LR调整,最终的调整结果如图中的e所示。 3.3 树、森林 3.3.1 树的存储结构 树的存储结构根据应用的不同,有多种形式。在此,我们介绍如下三种比较常用的方法。 双亲表示法 在这种方法中,用一组连续的存储单元存储树中的结点,结点的形式如图3-50所示。
7、 其中,data用于存放有关结点本身的信息,parent用于指示该结点的双亲位置。例如,图3-51a所示的树,其双亲表示法如图3-51b所示。 这种存储结构利用了每个结点(除根以外)只有唯一双亲的性质。在这种存储结构下,求结点的双亲十分方便,也很容易求树的根。但是在这种表示法中,在求结点的孩子时需要遍历整个存储空间。 孩子表示法 由于树中每个结点可能有多个孩子,所以自然想到用多重链表存储树。在这种多重链表的每个结点中除了用于存放数据信息的data域外,还有若干指针域,分别用于指向该结点的孩子结点。但是一棵树中,不同结点的度数是不同的,那么每个结点中到底需要多少个指针域呢?我们有如下二种方案:
8、定长结点的多重链表 在这种方法中,我们取树的度数作为每个结点的指针域数目。不难推导,一棵具有n个结点的度为K的树中必有n(k-1)+1个空指针。显然,这会造成存储空间的极大浪费。例如,图3-51a所示的树,其定长结点的多重链表如图3-52a所示。 不定长结点的多重链表 在定长结点的多重链表中,由于各结点指针的数目是根据树的度而定,所以造成了存储空间的浪费。下面我们考虑每个结点的指针域数目取它自己的度数。另外,在每个结点中设置一个度数域(degree),以指出该结点的度数,其表示方法如图3.52b所示。显然这种方法的存储密度较前者有所提高,但由于各结点的结构不同,自然会造成操作上的不方便。 孩子
9、-兄弟表示法 这种方法又称二叉树表示法。在这种二叉链表的每个结点中除了用于存放数据信息的data域外,还有两个指针域fch和nsib,分别用于指向该结点的第一个孩子结点和它的下一个兄弟结点。图3-53为图3-51a所示的树的孩子-兄弟链表。在这种存储结构中,树的操作比较方便,且存储密度较高。 不难发现它与一棵二叉树十分相似。二叉树结构规范、简单并具有一些重要性质,因此常将一般树结构转换为二叉树结构进行处理。 注意:这种存储结构的最大优点是它和二叉树的二叉链表表示完全一样。可利用二叉树的算法来实现对树的操作。 下面图3-54a所示的树可转换为图3-54d所示的二叉树。 注意:由于树根没有兄弟,故
10、树转化为二叉树后,二叉树的根结点的右子树必为空。 2)将一个森林转换为二叉树 森林是树的有限集合,如图3-55a所示。由上节可知,一棵树可以转换为二叉树,一个森林就可以转换为二叉树的森林。将森林转换为二叉树的一般步骤为: 将森林中每棵子树转换成相应的二叉树。形成有若干二叉树的森林,如图3-55b所示。 按森林图形中树的先后次序,依次将后边一棵二叉树作为前边一棵二叉树根结点的右子树,这样整个森林就生成了一棵二叉树,实际上第一棵树的根结点便是生成后的二叉树的根结点。图3-55是将一个森林转化为一棵二叉树的示例。图3-55d是转化后的一棵二叉树。 下图中,图a包含三棵树的森林可转换为图d的二叉树。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 平衡 二叉
链接地址:https://www.31ppt.com/p-3490652.html