———-
二叉搜索樹
二叉搜索樹相對於普通的二叉樹的區別就在於其內部數據額存儲是有規律的,任何一個節點其左邊的節點小與其根結點數值大小,其右邊節點則大與其根結點數值大小。
這樣做的意義就在於可以很快地實現查找,判斷也很容易進行。在上一篇日誌(二叉樹的基本性質)中就已經使用了生成二叉搜索樹的代碼,大家可以參考日誌中如何創建二叉樹的代碼。
元素的查找
- 利用遞歸進行查找
def treeSearch(x, k):
if x == None or k = x.data:
return x
elif k < x.data:
return treeSearch(x.left, k)
else:
return treeSearch(x.right, k)
- 非遞歸的查找
def treeSearch(x, k):
while x != None and k != x.data:
if k < x.data:
x = x.left
elif k > x.data:
x = x.right
else:
return x
元素的插入
元素的插入請參考二叉樹的性質那篇文章中的insert函數,直接調用即可插入元素。
元素的刪除
刪除元素共有如下三種情況:
- 若刪除的元素剛好是葉子節點,就直接刪除元素,然後把該結點用None來代替。
- 若刪除的元素只有一個孩子節點,那麼就把這個節點刪除再將其孩子節點變成現在的節點。
- 若刪除的元素有兩個孩子,那麼需要判斷的情況就稍微複雜一點,需要從該元素的右孩子樹中找到一個合適的元素(稱爲後繼)來代替該元素,原來的右子樹變爲當前更新元素的右子樹。
def treeDelete(Tree, z):
if z.left is None:
transplant(Tree, z, z.right)
elif z.right is None:
transplant(Tree, z, z.left)
else:
y = treeMaximum(z.right)
if y.p is not z:
transplant(Tree, y, y.right)
y.right.p = y
transplant(Tree, z, y)
y.left = z.left
y.left.p = y
#定義transplant函數,函數用在將一棵樹的子樹換爲另一個子樹
def transplant(Tree, u, v):
if u.p is None:
Tree.root = v
elif u == u.p.left
u.p.left = v
else:
u.p.right = v
if v is not None:
v.p = u.p
# 再定義上述使用過的最大元素的求解函數,就是找到最右邊的元素。
def treeMaximum(x)
while x.right is not None:
x = x.right
return x
# 其中上面的函數還涉及到x.p指的是x的父節點,是定義結構體的時候可以確定的。