二叉查找树性质
设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 y‘s satellite data into z 18 return y
时间: 2024-10-04 16:52:03