數據結構專題——二叉查找樹

一、二叉查找樹(Binary Search Tree)

名稱

二叉搜索樹(Binary Search Tree) 有序二叉樹(Ordered Binary Tree) 已排序二叉樹(Sorted Binary Tree)
二叉查找樹能夠實現動態查找。

二叉樹性質

  • 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
  • 若任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
  • 任意節點的左、右子樹也分別爲二叉查找樹;
  • 沒有鍵值相等的結點;

重要特性

設樹高度爲h,結點數爲n,關鍵字key,結點x的左孩子爲x.left,右孩子爲x.right,雙親爲x.p

遍歷

按中序遍歷二叉查找樹,可以得到一個關鍵字遞增或遞減的有序序列。
遍歷時間複雜度:O(n)

僞代碼(獲得遞增序列)

INORDER-TREE-WALK(x)
if x != NULL
    INORDER-TREE-WALK(x.left)
    print x.key
    INORDER-TREE-WALK(x.right)

查找

在二叉查找樹中查找給定關鍵字的結點。
查找時間複雜度:O(h)

僞代碼(採用迭代方式)

TREE-SEARCH(x,k)
while x != NULL and x.key != k
    if k < x.left
        x = x.left
    else
        x = x.right
return x

最大關鍵字元素和最小關鍵字元素

獲得二叉查找樹中的最小關鍵字或最大關鍵字的結點
時間複雜度:O(h)

(與《算法導論》不同,這裏不假設給定結點不爲NIL)
僞代碼(最小關鍵字結點)

TREE-MINIMUM(x)
while x != NULL
    x = x.left
return x

僞代碼(最大關鍵字結點)

TREE-MAXIMUM(x)
while x != NULL
    x = x.right
return x

前驅和後繼

獲得給定結點的前驅和後繼結點
注意:這裏前驅後繼結點針對二叉查找數的中序遍歷次序。
時間複雜度:O(h)

僞代碼(後繼,給定結點不爲NIL)

TREE-SUCCESSOR(x)
if x.right != NULL
    return TREE-MINIMUM(x.right)
y = x.p
while y != NULL and y.rig
ht == x
    x = y
    y = x.p
return y

僞代碼(前驅,給定結點不爲NIL)

TREE-PREDECESSOR(x)
if x.left != NULL
    return TREE-MAXIMUM(x.left)
y = x.p
while y != NULL and y.left == x
    x = y
    y = y.p
return y

插入和刪除

將新的結點插入到二叉查找樹中或從二叉查找樹中刪除。
注意:新的結點z實際上由key值k給出,預先初始化結點z:z.key=k,z.left=NIL,z.right=NIL
時間複雜度:O(h)

僞代碼(插入)

TREE-INSERT(T,z)
x = T.root
while x != NULL
    y = x
    if z.key < x.key
        x = x.left
    else
        x = x.right
z.p = y
if x == NULL
    T.root = z
else if z.key < y.key
    y.left = z
else
    y.right = z

二叉查找樹結點的刪除是一個比較複雜的操作。

  • 如果z沒有孩子,那麼只是簡單地將它刪除,並修改它的父結點,用NIL作爲孩子結點來替換z。
  • 如果z只有一個孩子,那麼將這個孩子提升到樹中z的位置上,並修改z的父結點,用z的孩子來替換z。
  • 如果z有兩個孩子,那麼找z的後繼y(一定是在z的右子樹中),並讓y佔據樹中z的位置。z原來右子樹的部分成爲y的新右子樹,並且z原來左子樹的部分成爲y的新左子樹。

僞代碼(子過程:用另一棵子樹替換一棵子樹併成爲其雙親的孩子結點)

TRANSPLANT(T,u,v)
if u.p == NULL
    T.root = v
else if u == u.p.left
    u.p.left = v
else
    u.p.right = v
if v != NULL
    v.p = u.p

僞代碼(刪除)

TREE-DELETE(T,z)
if z.left == NULL
    TRANSPLANT(T, z, z.right)
else if z.right == NULL
    TRANSPLANT(T, z, z.left)
else
    y = TREE-MINIMUM(T,z.right)
    if y.p != z
        TRANSPLANT(T, y, y.right)
        y.right = z.right
        y.right.p = y
    TRANSPLANT(T,z,y)
    y.left = z.left
    y.left.p = y 

隨機構建二叉查找樹

一棵用n個不同關鍵字的隨機構建二叉查找樹的期望高度爲O(lgn)。
注意:《算法導論》給出了詳細證明過程。

最壞情況分析

二叉查找樹上述操作最壞情況是O(n),此時一個數列有序,樹退化成線性表,樹的高度h = n。(先後插入的數本身是有序時會形成)

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