CLRS 12.2查詢二叉搜索樹

12.2-1
其中 c,e 不是查找過的序列。

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,則 A={3},B{1,4,5},C= ,取a=3,b=1,c= ,顯然不是 abc
這裏寫圖片描述

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

12.2-6
我們需要證明:y 的左孩子是 x 的祖先,並且是最底層祖先。
1) y 的左孩子也是 x 的祖先
假設 y 的左孩子不是 x 的祖先,則說明 yx 爲根的子樹不互相包含,因此這兩棵子樹有一個公共節點 z ,則 z 一定夾在 xy 之間,因此 y 不是 x 的後繼,與條件矛盾,因此 y 的左孩子也是 x 的祖先;
2) yx 的最低祖先
假設 y 不是 x 的最低祖先,zx 的最低祖先,則 z 一定夾在 xy 之間,因此 y 不是 x 的後繼,與條件矛盾,因此 yx 的最低祖先。
得證。

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) xy 的左孩子,則 xy 的前驅,y.key 是樹 T 中大於 x.key 的最小關鍵字;
2) xy 的右孩子,則 xy 的後繼,y.key 是樹 T 中小於 x.key 的最大關鍵字;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章