一、折半(查找)二叉(判定)樹
1.二叉判定樹
二叉判定樹是用於描述解決問題的思路,比如可以使用判定樹描述N個數的比較過程,
它也可以用於描述折半查找即二分查找的過程,
描述折半查找的二叉判定樹,我們也可以叫折半查找判定樹 或者 折半(查找)二叉(判定)樹,
從這個判定樹我們可以分析算法的效率,
2.長度為n的折半查找判定樹的構造方法
- 當n=0時,折半查找判定樹為空;
- 當n>0時,折半查找判定樹的根結點是有序表中序號為mid=(n+1)/2的記錄,根結點的左子樹是與有序表r[1] ~ r[mid-1]相對應的折半查找判定樹,根結點的右子樹是與r[mid+1] ~ r[n]相對應的折半查找判定樹。
3.長度為10的折半查找判定樹的具體生成過程
- 在長度為10的有序表中進行折半查找,
先和中間記錄進行比較,而中間記錄的序號為(1+10)/2=5,
即判定樹的根結點是5,如圖7-2(a)所示; - 考慮判定樹的左子樹,即 將查找區間調整到左半區,此時的查找區間是[1,4],也就是,左分支上根結點的值減1,代表查找區間的上限high,此時,根結點的左孩子是(1+4)/2=2,如圖7-2(b)所示;
- 考慮判定樹的右子樹,即 將查找區間調整到右半區,此時的查找區間是[6,10],也就是,右分支上根結點的值加1,代表查找區間的下限low,此時,根結點的右孩子是(6+10)/2=8,如圖7-2(c)所示;
- 重復⑵⑶步,依次確定每個結點的左右孩子,不斷縮小,如圖7-2(d)所示。
4.補充:
-
折半查找判定樹 是一顆 二叉判定樹 也是 一棵二叉排序/查找樹,即每個結點的值均大於其左子樹上所有結點的值,小於其右子樹上所有結點的值;
-
折半查找判定樹中的結點都是查找成功的情況,
而將每個結點的空指針指向的一個實際上並不存在的結點——稱為外結點,所有外結點即是查找不成功的情況,
如圖7-2(e)虛線框所示。如果有序表的長度為n,則外結點一定有n+1個。 -
在折半查找判定樹中,某結點所在的層數即是查找該結點的比較次數。
查找不成功時的比較次數即是查找相應外結點時與內結點的比較次數。或者換一種方式說:
成功的折半查找過程,恰好是走了一條從根到被查記錄的路徑,比較次數恰為該記錄在樹中的層數。
若查找失敗,則其比較過程是一條根到某個外部結點的路徑,比較次數是該路徑上內部結點的總數。
-
整個判定樹代表的有序表的平均查找長度即為查找每個結點的比較次數之和除以有序表的長度。例如,長度為10的有序表的平均查找長度為: ASL=(1×1+2×2+3×4+4×3)/10=29/10
整個判定樹代表的有序表在查找失敗時的平均查找長度即為查找每個外結點的比較次數之和除以外結點的個數(1+n)。例如,長度為10的有序表在查找失敗時的平均查找長度為: ASL=(3×5+4×6)/11=39/11查找成功:
①(每層結點數 × 比較次數(層數))/n
查找失敗:
① 補全外節點
②(每層外節點數×比較次數(上一層層數))/(n+1)
5.具體例子
構造折半二叉樹的流程
例:畫出(3,17,22,27,40,55,61,75,80,91,97)的折半二叉樹
①序列總長度為 n = 11 > 2^3 -1 = 7,即可判定二叉判定樹為4層,第4層不滿
②先畫滿n-1的完全二叉樹
③還剩幾個結點,遵循先右后左補全
④根據中序遍歷順序填入
結果如圖:
查找流程:
比如查找75:
①查找成功,查找到第四層結點
②先拿75和55比較,75大,進入當前結點的左子樹,反之進入右子樹
③重復②,除非得到相等結果 或 找不到 以下一層的外節點表示。
查找50:
①查找失敗,查找到第五層外節點
②先拿50和55比較。55小,進入當前結點的右子樹,反之進入左子樹
③重復②,除非得到相等結果 或 找不到 以下一層的外節點表示。
比較次數:
查找75:與55比較,與80比較,與61比較,與75比較得到結果——>4次
查找50:與55比較,與22比較,與27比較,與40比較得到外結點——>4次
查找成功時的平均查找長度:【查找每個結點的比較次數之和除以有序表的長度】
ASL=(1×1+2×2+3×4+4×4)/10=33/11=3
查找失敗時的平均查找長度:【查找每個外結點的比較次數之和除以外結點的個數】
ASL=(3×4+4×8)/12=44/12=11/3