演算法導論12 2查詢二叉搜尋樹 練習總結

2021-07-05 11:59:39 字數 2752 閱讀 2422

12.2-1 假設一棵二叉搜尋樹中的結點在 1 到 1000 之間,現在想要查詢數值為 363 的結點。下面序列中哪個不是查詢過的序列?

a. 2, 252, 401, 398,330,344,397,363。

b. 924,220,911,244,898,258,362,363。

c. 925,202,911,240,912,245,363。

d. 2,399,387,219,266,382,381,278,363。

e. 935,278,347,621,299,392,358,363。

answer:

c:240 < 911,即 240 是 911 的左子樹,則 240 後的數需小於 911,而 912 > 911,矛盾。

e:621 > 347,即 621 是 347 的右子樹,則 621 後的數需大於 347,而 299 < 347,矛盾。

12.2-2 寫出 tree-minimum 和 tree-maximum 的遞迴版本。

answer:

tree_minimum(root)
tree_maximum(root)
12.2-3 寫出過程 tree-predecessor 的偽**。answer:

偽**:

tree-predecessor(x)

if x.left ≠ nil

return tree-maximum(x.left)

y = x.p

while y ≠ nil and x == y.left:

x = y

y = x.p

reutrn y

12.2-4 bunyan 教授認為他發現了乙個二叉搜尋樹的重要性質。假設在一棵二叉搜尋樹中查詢乙個關鍵字 k,查詢結束於乙個樹葉。考慮三個集合:a 為查詢路徑左邊的關鍵字集合;b 為查詢路徑上的關鍵字集合;c 為查詢路徑右邊的關鍵字集合。bunyan 教授聲稱:任何 a ∈ a,b ∈ b 和 c ∈ c,一定滿足 a ≤ b ≤ c。請給出該教授這個論斷的乙個最小可能的反例。answer:

12.2-5 證明:如果一棵二叉搜尋樹中的乙個結點有兩個孩子,那麼它的後繼沒有左孩子,它的前驅沒有右孩子。

answer:根據 tree-successor ( tree-predecessor ),如果結點 x 有右(左)兒子,則返回右(左)兒子的 tree-minimum ( tree-maximum ),所以後繼(前驅)沒有左(右)兒子。

12.2-6 考慮一棵二叉搜尋樹 t,其關鍵字互不相同。證明:如果 t 中乙個結點 x 的右子樹為空,且 x 有乙個後繼 y,那麼 y 一定是 x 的最底層祖先,並且其左孩子也是 x 的祖先。(注意到,每個結點都是它自己的祖先。)

answer:當結點 x 的右兒子為空時,執行的迴圈演算法就是題意。

12.2-7 對於一棵有 n 個結點的二叉搜尋樹,有另一種方法來實現中序遍歷,先呼叫 tree-minimum 找到這棵樹中的最小元素,然後再呼叫 n-1 次的tree-successor。證明:該演算法的執行時間為 θ(n)。

answer:每條邊遍歷了兩次。所以時間為θ(n)。

12.2-8 證明:在一棵高度為 h 的二叉搜尋樹中,不論從哪個結點開始,k 次連續的 tree-successor 呼叫所需時間為 o( k+h )。

answer:假設開始的結點為v,結束的結點為t。

① 若 v 和 t 在同一條路徑上,即 v 是 t 的祖先或者 t 是 v 的祖先,則和 12.2-7 一樣,所示時間為 o( k )。

② 若 v 和 t 不在同一路徑上;則令 w 是 v 和 t 的最小公共祖先,則從 v 到 t 過程必經過 w。從 v 到 w 和 w 到 t 的過程的時間必不大於 2h+2h ,即 o( h )。另外的在 v 到 w 和 w 到 t 經過的分支的時間複雜度之和為 o( k )。

所以總時間複雜度為 o( h+k )。

12.2-9 設 t 是一棵二叉搜尋樹,其關鍵字互不相同;設 x 是乙個葉結點,y 為其父結點。證明:y.key 或者是 t 樹中大於 x.key 的最小關鍵字,或者是 t 樹中小於 x.key 的最大關鍵字。

answer:由於 x 是葉結點,所以 x 沒有兒子;

若 x 是 y 的左兒子,則 y 是 x 的後繼(即y.key 是 t 樹中大於 x.key 的最小關鍵字);

若 x 是 y 的右兒子,則 y 是 x 的前驅(即

y.key 是 t 樹中小於 x.key 的最大關鍵字)。

演算法導論 二叉搜尋樹

搜尋樹資料結構支援許多動態集合操作,包括search minimum maximum predecessor successor insert和delete等。因此,我們使用一棵搜尋樹既可以作為乙個字典又可以作為乙個優先佇列。二叉搜尋樹上的基本操作所花費的時間與這棵樹的高度成正比。對於乙個有n個結點...

演算法導論二叉搜尋樹

兩天寫完的,沒有認認真真的測試,可能有些bug,自己測試的資料能過,但是我的初始化有些問題,不知道該怎麼表示 二叉搜尋樹 include include using namespace std struct node void inorder search node root1 node tree ...

CLRS 12 2查詢二叉搜尋樹

12.2 1 其中 c,e 不是查詢過的序列。12.2 2 直接給 struct bintree bintree tree minimum bintree root bintree tree maximum bintree root 12.2 3 直接上 struct bintree bintree...