12.2-1
其中
12.2-2
直接給代碼
struct BinTree
{
int key;
BinTree *parent;
BinTree *left;
BinTree *right;
};
BinTree *TREE_MINIMUM(BinTree *root)
{
if(root == NULL)
return root;
if(root->left == NULL)
return root;
else return TREE_MINIMUM(root->left);
}
BinTree *TREE_MAXIMUM(BinTree *root)
{
if(root == NULL)
return root;
if(root->right == NULL)
return root;
else return TREE_MAXIMUM(root->right);
}
12.2-3
直接上代碼
struct BinTree
{
int key;
BinTree *parent;
BinTree *left;
BinTree *right;
};
BinTree *TREE_PREDECESSOR(BinTree *p)
{
if(p == NULL)
return p;
if(p->left != NULL)
return TREE_MAXIMUM(p->left);
BinTree *x = p->parent;
while(x != NULL && p = x->left)
{
p = x;
x = x->parent;
}
return x;
}
12.2-4
如圖,查找5,則
12.2-5
如果一個結點有兩個孩子,那麼它的後繼一定是右子樹種的最左結點,既然是最左結點,肯定沒有左孩子。由對稱知前驅沒有右孩子。
12.2-6
我們需要證明:
1)
假設
2)
假設
得證。
12.2-7
這個做法和INORDER-TREE-WALK
完全一樣,INORDER-TREE-WALK
也是先找出最小值,然後依次找後繼。
這個算法是
1) 每個結點至少要訪問一次,因此是
2) 每條邊至多訪問
證明每條邊至多訪問 TREE-MINIMUM
,唯一從下向上遍歷是查找一個結點後繼卻沒有右孩子時TREE-SUCCESSOR
)。
12.2-8
參考練習12.2-7中每條邊至多訪問兩次進行證明(具體證明暫不會)。
12.2-9
1)
2)