以下給出我在學習中總結的一種比較簡便的構造折半二叉判定樹的思路以及方法:
思路分析:
在計算mid值時,使用的時mid=(low+high)/2 。這裡由於mid為int型別,自動預設為向下取整,因此對於乙個長度為n序列進行劃分之後的序列為 (0,1,2,……,mid-1)mid(mid+1,mid+2,……n-1),此時出現兩種情況:
因此可以得知,折半查詢的二叉判定樹對於所有結點,左子樹結點個數<=右子樹結點個數。即:
若某序列總長n為奇數,左右子樹結點個數相等;
若某序列總長n為偶數,左字數結點個數=右子樹結點個數-1.
按照結點總數先畫出最大的滿二叉樹結構,並計算剩餘幾個結點。
將剩餘結點按照上述的規律依次填入最底層即為二叉判定樹的樹形。
將給定序列依次按照中序遍歷順序填入各個結點。
具體如下面的例子:
例:畫出(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的所有樹形畫幾遍,就可以很熟練的掌握這個方法。
二叉判定樹畫出之後便可以對其他具體題目進行分別的計算,如求成功或失敗的查詢長度、求比較順序、比較次數等。
資料結構學習(1) 二叉樹
二叉樹結構 public class treenode 前序遍歷 根結點,左子樹,右子樹 public static void prenode treenode node,listtreelist 中序遍歷 左子樹,根結點,右子樹 public static void midnode treenod...
資料結構學習筆記 二叉樹
樹,非線性表結構 樹有三個概念 高度從下向上數,起點是0 深度從上向下數,起點是0 層數從上向下數,起點是1 每個節點最多兩個叉 有兩種特殊二叉樹 滿二叉樹,除了葉子節點,每個節點都有左右兩個子節點 完全二叉樹,葉子節點都在最底下兩層,最後一層葉子節點都靠左排列,且除了最後一層,其它層節點個數都達到...
資料結構學習之二叉樹
一 為什麼用二叉樹,而不是三個指標域或是根據實際情況指定指標域?比如3,那麼有n個節點就是有3n個指標域,其中邊只有n條,那麼只有n 1個域非空,有2n 1個域為空,浪費空間。而對於2,那麼就只有n 1個域為空。而比如說根據實際來確定指標域,對於實現上是非常困難的。度為2的樹就是二叉樹。斜二叉樹 完...