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