我们经常需要查找一个存储在二叉搜索树中的关键字,除了SEARCH操作之外,二叉搜索树还能支持诸如MINIMUM、MAXIMUM、SUCCESSOR和PREDECESSOR的查询操作。
在任何高度为h的二叉搜索树上,如何在O(h)的时间内执行完每个操作。
查找:
在一棵二叉搜索树中查找一个具有给定关键字的节点,输入一个指向树根的指针和一个关键字k,如果这个结点存在,返回一个指向关键字k的结点的指针,否则返回NIL。
class Node:
def __init__(self,key,right,left,p):
self.key=key
self.right=right
self.left=left
self.p=p
class tree:
def __init__(self,root):
self.root=root
def tree_insert(self,z):
y=None
x=self.root
while x!=None:
y=x
if z.key<x.key:
x=x.left
else:
x=x.right
z.p=y
if y==None:
self.root=z
elif z.key<y.key:
y.left=z
else:
y.right=z
def inorder_tree_walk(self,x):
if x!=None:
self.inorder_tree_walk(x.left)
print(x.key)
self.inorder_tree_walk(x.right)
def tree_search(self,x,k):
if x==None or k==x.key:
return x
if k < x.key:
return self.tree_search(x.left,k)
else: return self.tree_search(x.right,k)
def iterative_tree_search(self,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(self,x):
while x.left!=None:
x=x.left
return x
def tree_maximum(self,x):
while x.right!=None:
x=x.right
return x
def tree_successor(self,x):
if x.right!=None:
return self.tree_minimum(x.right)
y=x.p
while y!=None and x==y.right:
x=y
y=y.p
return y
运行:
>>> root=Node(15,None,None,None)
>>> t=tree(root)
>>> T=[6,18,3,7,17,20,2,4,13,9]
>>> for i in T:
r=Node(i,None,None,None)
t.tree_insert(r)
>>> x=t.tree_search(t.root,20)
>>> x.key
20
>>> x
<__main__.Node object at 0x03E01DF0>
>>> x.p
<__main__.Node object at 0x03E012F0>
>>> x.p.key
18
>>> t.tree_minimum(t.root)
<__main__.Node object at 0x03E01E10>
>>> x=t.tree_minimum(t.root)
>>> x.key
2
>>> x=t.tree_maximum(t.root)
>>> x.key
20