数据结构学习记录(二)——折半查找二叉判定树的画法

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

思路分析:

在计算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,……)

因此可以得知,折半查找的二叉判定树对于所有结点,左子树结点个数<=右子树结点个数。即:

  1. 若某序列总长n为奇数,左右子树结点个数相等;
  2. 若某序列总长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的所有树形画几遍,就可以很熟练的掌握这个方法。

二叉判定树画出之后便可以对其他具体题目进行分别的计算,如求成功或失败的查找长度、求比较顺序、比较次数等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章