12.1什么是二叉搜索树
def:二叉搜索树是具有如下性质的二叉树,设x是二叉搜索树中的一个节点。如果y是x左子树中的一个节点,那么y.key <= x.key。如果y是x右子树中的一个节点,那么 y.key >= x.key。
二叉搜索树的性质运行我们通过一个递归算法允许我们按序输出所有节点。如中序遍历:
def INORDER_TREE_WALK(x):
if x != None:
INORDER_TREE_WALK(x.left)
print( x.key)
INORDER_TREE_WALK(x.right)
算法分析:
12.2 查询二叉搜索树
由二叉搜索树的性质我们有如下定理:
def TREE_SEARCH(x, k):
if x == None or k == x.key:
return x
if k < x.key:
return TREE_SEARCH(x.left, k)
else:
return TREE_SEARCH(x.right,k)
def ITERATIVE_TREE_SEARCH(x,k):
while x != None and k != x.key:
if k < x.key:
x = x.left
else:
x = x.right
return x
def TREE_MINIMUM(x):
while x.left != None:
x = x.left
return x
def TREE_MAXIMUM(x):
while x.right != None:
x = x.right
return x
def TREE_SUCCESSOR(x):
if x.right != None:
return TREE_MINIMUM(x.right)
y = x.parent
while y != None and x == y.right:
x = y
y = y.parent
return y
def TREE_PREDECESSOR(x):
if x.left != None:
return TREE_MAXIMUM(x.left)
y = x.parent
while y != None and x == y.left:
x = y
y = y.parent
return y
以上过程完成对定理的证明
12.3插入和删除
def TREE_INSERT(T, z):
y = None
x = T.root
while x != None:
y = x
if z.key < x.key:
x = x.left
else:
x = x.right
z.parent = y
if y == None:
T.root = z
elif z.key < y.key:
y.left = z
else:
y.right = z
def TRANSPLANT(T, u, v):
if u.parent == None:
T.root = v
elif u == u.parent.left:
u.parent.left = v
else:
u.parent.right = v
if v != None:
v.parent = u.parent
def TREE_DELETE(T, z):
if z.left == None:
TRANSPLANT(T, z, z.right)
elif z.right == None:
TRANSPLANT(T, z, z.left)
else:
y = TREE_MINIMUM(z.right)
if y.parent != z:
TRANSPLANT(T, y, y.right)
y.right = z.right
y.right.parent = y
TRANSPLANT(T, z, y)
y.left = z.left
y.left.parent = y
以上过程完成对定理的证明
12.4随机构建二叉搜索树