折半查找的二叉判定树是否完全二叉树?为啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了折半查找的二叉判定树是否完全二叉树?为啥?相关的知识,希望对你有一定的参考价值。
不一定,完全二叉树是序号和满二叉树一样。二叉判定树不一定序号相同,或者说极少序号相同! 参考技术A不一定。我们可以递归地来证明。(嫌太繁琐的话,看每段第一句应该能有个大概。。。【】里面的就省了吧)
首先,二叉树每个根结点P一定是有序序列{{左子树},根结点P,{右子树}}的中间值。
其次,由于二叉判定树与二分查找紧密联系,所谓中间值从“二分法”mid=(bot+top)/2取得(前提是有序序列,不妨设一维数组a[n]元素非递减,零元素a[0]不用,mid,bot,top为数组下标),直观上就“取奇数序列的正中间,偶数序列前半部分的末尾”(数学知识,就不多讲,随便代入两三个数就知道了)。
【例如,奇数情况,{……,1,2,3,……}的中间值取为2,{……,1}为其左子树,{3,……}为其右子树;偶数情况,{……,8,9,……}的中间值取为8,{……}为其左子树,{9,……}为其右子树。(“……”可以为空)】
之后,不难发现,对于二叉判定树的任意一个非叶子结点P,只有“同时存在左右子树”和“仅存在右子树”两种情况。
又这样的结点P若是出现在倒数第一层、倒数第二层以外的地方,不可能出现“仅有右子树”的情况。【(否则论证结点P一定单独出现的情况)若结点P成对出现,则总层数从原来的k层退化为k-1层,P在倒数第几层也就要重新判断了;若结点P单独出现,P与其兄弟结点上加挂子树的总结点数不同,这与mid的求法矛盾,不可能存在。】
故而,【二叉判定树的任意一个非叶子结点P,倒数第二层向上,只有“同时存在左右子树”的情况,而倒数第二层有“同时存在左右子树”和“仅存在右子树”两种情况】。简言之,就是k层二叉判定树,1~k-1层是满二叉树,第k层呢,左结点存在时右结点一定存在,右结点存在时左结点不一定存在。
综上所述,具有n个结点的判定树,与具有n个结点的完全二叉树的深度完全相同。
——————————————————————————————————————
不好意思,我也是大二刚学数据结构,这段论证也是看到问题才开始想的,就五分钟左右,有点仓促,如果不严密不要介意哈/laugh.
二叉树详解
二叉树
二叉树常被用作二叉查找树和二叉堆
二叉树的第i层至多有2^{i-1}个结点
深度为k的二叉树至多有2^k-1个结点
一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树
完全二叉树
完全二叉树是效率很高的数据结构,堆是一种完全二叉树或者近似完全二叉树,所以效率极高,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,几乎每次都要考到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。
叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
一棵二叉树至多只有最下面的一层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树。
叶子结点只可能在最大的两层上出现,对任意结点,若其右分支下的子孙最大层次为L,则其左分支下的子孙的最大层次必为L 或 L+1。
具有n个结点的完全二叉树的深度为int(log2n)+1
出于简便起见,完全二叉树通常采用数组而不是链表存储:
(1)若i为奇数且i>1,那么tree的左兄弟为tree[i-1];
(2)若i为偶数且i<n,那么tree的右兄弟为tree[i+1];
(3)若i>1,tree的父亲节点为tree[i div 2];
(4)若2*i<=n,那么tree的左孩子为tree[2*i];若2*i+1<=n,那么tree的右孩子为tree[2*i+1];
(5)若i>n div 2,那么tree[i]为叶子结点(对应于(3));
(6)若i<(n-1) div 2.那么tree[i]必有两个孩子(对应于(4))。
(7)满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
满二叉树
除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树,。
平衡二叉树
- 平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树,反之则不一定。
- 二叉树的每个节点的左子树减去右子树定义为该节点的平衡因子。二叉平衡树的平衡因子只能是1、0或者-1。
- 平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。
- 二叉搜索树有一个缺点就是,树的结构是无法预料的,随意性很大,它只与节点的值和插入的顺序有关系,往往得到的是一个不平衡的二叉树。在最坏的情况下,可能得到的是一个单支二叉树,其高度和节点数相同,相当于一个单链表,对其正常的时间复杂度有O(lb n)变成了O(n),从而丧失了二叉排序树的一些应该有的优点。
- 其高度一般都良好地维持在O(log(n)),大大降低了操作的时间复杂度。
- 当插入一个新的节点的时候,在普通的二叉树中不用考虑树的平衡因子,只要将大于根节点的值插入到右子树,小于节点的值插入到左子树,递归即可。而在平衡二叉树则不一样,在插入节点的时候,如果插入节点之后有一个节点的平衡因子要大于2或者小于-2的时候,他需要对其进行调整,现在只考虑插入到节点的左子树部分(右子树与此相同)
- 平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
- 采用平衡树的优点是:使树的结构较好,从而提高查找运算的速度。缺点是:是插入和删除运算变得复杂化,从而降低了他们的运算速度。
类型
- 完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
- 满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
- 平衡二叉树——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
以上是关于折半查找的二叉判定树是否完全二叉树?为啥?的主要内容,如果未能解决你的问题,请参考以下文章