第十二章 二叉查找树
总结:这章介绍了二叉查找树,介绍了获得某个节点的前驱、后继的方法,介绍了搜索、插入、删除等操作。
1. 二叉查找树
对一颗二叉查找树的任何节点,该节点的左子树中的任何一个节点的值都小于等于该节点的值,该节点的右子树中的任何一个节点的值都大于等于该节点的值。
中序遍历二叉查找树,输出的序列是按序的。遍历操作的复杂度O(n)
伪代码
INORDER-TREE-WALK(x)
if x!=NIL
then INORDER-TREE-WALK(left[x])
print key[x]
INORDER-TREE-WALK(right[x])
2. 查询
SEARCH、MINIMUM、MAXIMUM、SUCCESSOR、PREDECESSOR等的运行时间都是O(h),其中h为树的高度。
1)查找操作:
伪代码
TREE-SEARCH(x,k)
if x=NIL or k=key[x]
then return x
if k<key[x]
then return TREE-SEARCH(left[x],k)
else return TREE-SEARCH(right[x],k)
伪代码
ITERATIVE-TREE-SEARCH(x,k)
while x!=NIL and k!=key[x]
do if k < key[x]
then x <- left[x]
else x <- right[x]
return x
2)最大值、最小值:
伪代码
TREE-MINIMUM(x)
while left[x]!=NIL
do x <- left[x]
return key[x]
伪代码
TREE-MAXIMUM(x)
while right[x]!=NIL
do x <- right[x]
return x
3)前驱和后继:
伪代码
TREE-SUCCESSOR(x)
if right[x]!=NIL
return TREE-MINIMUM(right[x])
y <- p[x]
while y!=NIL and x=right[y]
do x <- y
y <- p[x]
return y
3. 插入
时间复杂度O(h)
伪代码
TREE-INSERT(T,z)
y <- NIL
x <- root[T]
while x!=NIL
do y <- x
if key[z] < key[x]
then x <- left[x]
else x <- right[x]
p[z] <- y
if y=NIL
then root[T] <- z
else if key[z] < key[y]
then left[y] <- z
else right[y] <- z
4. 删除
时间复杂度O(h)
伪代码
TREE-DELETE(T,z)
if left[z]=NIL or right[z]=NIL
then y <- z
else y <- TREE-SUCCESSOR(T,z)
if left[y]!=NIL
then x <- left[y]
else x <- right[y]
if x!=NIL
then p[x] <- p[y]
if p[y]=NIL
then root[T] <- x
else if y=left[p[y]]
then left[p[y]] <- x
else right[p[y]] <- x
if y!=z
then key[z] <- key[y]
return y