一、二叉查找樹(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。(先後插入的數本身是有序時會形成)