算法导论学习笔记——第12章 二叉查找树

二叉查找树性质

设x是二叉查找树中的一个结点,如果y是x的左子树中的一个结点,则k[y]<=key[x];如果y是右子树中的一个结点,则k[y]>=k[x]

1 //中序遍历算法,输出二叉查找树T中的全部元素
2 INORDER-TREE-WALK(x)
3 if x!=nil
4     then INORDER-TREE-WALK(left[x])
5             print key[x]
6             INORDER-TREE-WALK(right[x])

查找

 1 //递归版本
 2 TREE-SEARCH(x,k)
 3 if x=nil or k=key[x]
 4     then return x
 5 if k<key[x]
 6     then return TREE-SEARCH(left[x],k)
 7     else return TREE-SEARCH(right[x],k)
 8 
 9 //非递归版本
10 ITERATIVE-TREE-SEARCH(x,k)
11 while x!=nil and k!=key[x]
12     do if k<key[x]
13         then x←left[x]
14         else x←right[x]
15 return x

 

最大元素,最小元素,next和prev

 1 TREEMINIMUM(x)
 2 while left[x]!=nil
 3     do x←left[x]
 4 return x
 5 
 6 TREE-MAXIMUM(x)
 7 while right[x]!=nil
 8     do x←right[x]
 9 return x
10 
11 TREE-SUCCESSOR(x)
12 if right[x]!=nil
13     then return TREE-NIMIMUM(right[x])
14 y←p[x]
15 while y!=nil and x=right[y]
16     do x←y
17         y←p[y]
18 return y

插入

 1 TREE-INSERT(T,z)
 2 y←nil
 3 x←root[T]
 4 while x!=nil
 5     do y←x
 6         if key[z]<key[x]
 7             then x←left[x]
 8             else x←right[x]
 9 p[z]←y
10 if y=nil
11     then root[T]←z
12     else if key[z]←key[y]
13         then left[y]←z
14         else right[y]←z

删除

 1 TREE-DELETE(T,z)
 2 if left[z]=nil or right[z]=nil
 3     then y←z
 4     else y←TREE-SUCCESSOR(z)
 5 if left[y]!=nil
 6     then x←left[y]
 7     else x←right[y]
 8 if x!=nil
 9     then p[x]←p[y]
10 if p[y]=nil
11     then root[T]←x
12     else if y=left[p[y]]
13         then left[p[y]]←x
14         else right[p[y]]←x
15 if y!=x
16     then key[z]←key[y]
17         copy ys satellite data into z
18 return y

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。