二分判定树的画法

以下给出我在学习中总结的一种比较简便的构造折半二叉判定树的思路以及方法:

思路分析:

在计算mid值时,使用的时mid=(low+high)/2  。这里由于mid为int类型,自动默认为向下取整,因此对于一个长度为n序列进行划分之后的序列为 (0,1,2,……,mid-1)mid(mid+1,mid+2,……n-1),此时出现两种情况:

左子序列长==右子序列长      (n=2k+1    k=0,1,2,……)
左子序列长==右子序列长-1   (n=2k        k=1,2,3,……)
因此可以得知,折半查找的二叉判定树对于所有结点,左子树结点个数<=右子树结点个数。即:

若某序列总长n为奇数,左右子树结点个数相等;
若某序列总长n为偶数,左字数结点个数=右子树结点个数-1.
换句话说,对判定树中所有结点都有:
(左子树结点数-右子树结点数==-1)||(左子树结点数-右子树结点数==0)
由此给定某个序列,构建折半查找判定树方法如下三步:

  1. 按照结点总数先画出最大的满二叉树结构,并计算剩余几个结点。
  2. 将剩余结点按照上述的规律依次填入最底层即为二叉判定树的树形。
  3. 将给定序列依次按照中序遍历顺序填入各个结点。

具体如下面的例子:

 

例:画出(2,5,7,10,14,15,18,23,35,41,52)的折半查找判定树。

1.序列总长度为n=11>2^3-1     即二叉判定树为4层,前三层为满二叉树结构,剩余4个结点。

先画出前三层结构。

2.

1)第一个结点。a的左右子树结点个数相等,所以新的结点应加入a的右子树;再看a的右子树,c的左右子树结点个数相等,所以新结点应加入c的右子树;再看c的右子树,g的左右子树结点个数相等,所以新结点应加入g的右子树;如图

2)第二个结点。a的左子树结点数-右子树结点数=-1,所以新结点应加入a的左子树(若加入右子树,对于a来说左右子树结点之差=-2,不符合规律);再看a的左子树,b的左右子树结点个数相等,所以新结点应加入b的右子树;再看b的右子树,e的左右子树结点个数相等,所以新结点应加入e的右子树。如图

3)同理分析,第三个结点应加在如图位置。

4)第四个结点加在如图位置。

得到最终的树形如上图。(字母编号不唯一,但后面中序遍历结果会不同)

3.该二叉树的中序遍历顺序为dkbeiafjcgh,分别对应2,5,7,10,14,15,18,23,35,41,52。因此将序列一一对应填入树中,即

该树即为此序列的二叉判定树。

做题过程中熟练使用此方法比通过算法模拟来推断二叉判定树的速度要快许多倍。

在平时做题过程中,涉及到需要具体画出二叉判定树的题目,往往结点个数(序列长度)不超过2^4-1=15个,即一般为高度不超过4的树,因此可以在练习时将结点个数8-14的所有树形画几遍,就可以很熟练的掌握这个方法。

二叉判定树画出之后便可以对其他具体题目进行分别的计算,如求成功或失败的查找长度、求比较顺序、比较次数等。
————————————————
版权声明:本文为CSDN博主「Vee_99」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/BlevMeM/article/details/84672731

  • 16
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值