CLRS 12 2查詢二叉搜尋樹

2021-09-30 12:56:11 字數 1775 閱讀 3383

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 *tree_predecessor(bintree *p)

return x;

}

12.2-4

如圖,查詢5,則 a=

,b,c

=⊘,取a=

3,b=

1,c=

⊘ ,顯然不是 a≤

如果乙個結點有兩個孩子,那麼它的後繼一定是右子樹種的最左結點,既然是最左結點,肯定沒有左孩子。由對稱知前驅沒有右孩子。

12.2-6

我們需要證明:

y 的左孩子是

x的祖先,並且是最底層祖先。

1) y

的左孩子也是

x的祖先

假設 y

的左孩子不是

x的祖先,則說明

y 和

x為根的子樹不互相包含,因此這兩棵子樹有乙個公共節點

z ,則

z一定夾在

x 和

y之間,因此

y 不是

x的後繼,與條件矛盾,因此

y 的左孩子也是

x的祖先;

2) y

是 x的最低祖先

假設 y

不是 x的最低祖先,

z 為

x的最低祖先,則

z 一定夾在 x和

y 之間,因此

y不是

x 的後繼,與條件矛盾,因此 y是

x 的最低祖先。

得證。12.2-7

這個做法和inorder-tree-walk完全一樣,inorder-tree-walk也是先找出最小值,然後依次找後繼。

這個演算法是 θ(

n)是因為:

1) 每個結點至少要訪問一次,因此是 ω(

n);

2) 每條邊至多訪問

2 次,因此是 o(

n)。 證明每條邊至多訪問 2

u和它的孩子結點

v ,唯一從上向下遍歷的是tree-minimum,唯一從下向上遍歷是查詢乙個結點後繼卻沒有右孩子時tree-successor)。

12.2-8

參考練習12.2-7中每條邊至多訪問兩次進行證明(具體證明暫不會)。

12.2-9

1) x是 y

的左孩子,則 x是

y 的前驅,y.

key是樹

t 中大於 x.

key的最小關鍵字;

2) x

是 y的右孩子,則

x 是

y的後繼,y.

key 是樹

t 中小於 x.

key的最大關鍵字;

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

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,24...

Codeup二叉查詢樹 二叉搜尋樹

判斷兩序列是否為同一二叉搜尋樹序列 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。接下去的n行有n個序列,每個序列格式跟第乙個序列一樣,請判斷這兩個序列是否能組...

二叉排序樹 二叉搜尋樹 二叉查詢樹

特點 結構體定義struct node 建樹 建二叉排序樹 void create node root,int t else if t root data create root lc,t else create root rc,t 前序遍歷 層序 字典序 int flag int pre 1001...