class Tree: p = None left = None right = None key = 0pseudo-code
Inorder_Tree_Walk( x )
if x != NIL
then Inorder_Tree_Walk( left[x] )
print key[x]
Inorder_Tree_Walk( right[x] )
python codedef inorder_tree_walk( t ):
if t != None:
inorder_tree_walk( t.left )
print t.key,
inorder_tree_walk( t.right )pseudo codeTree_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 )python codedef tree_search( t , k ):
if (t == None) or (k == t.key):
return t
if k < t.key:
return tree_search( t.left, k )
return tree_search( t.right, k )pseudo codeTree_Minimum( x )
while left[x] != NIL
do x <- left[x]
return xpython codedef tree_minimum( t ):
while t.left != None:
t = t.left
return tpseudo codeTree_Maximum( x )
while right[x] != NIL
do x <- right[x]
return xpython codedef tree_maximum( t ):
while t.right != None:
t = t.right
return tpython codedef tree_root( t ):
while ( t.p != None):
t = t.p
return tpseudo codeTree_Successor( x )
if right[x] != NIL
then return Tree_Minimum( right[x] )
y <- p[x]
while y != NIL and x = right[y]
do x <- y
y <- p[y]
return ypython codedef tree_successor( t ):
if t.right != None:
return tree_minimum( t.right )
y = t.p
while (y != None) and (t == y.right):
t = y
y = y.p
return ypseudo codeTree_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[x] <- y
if y = NIL
then root[T] <- z
else if key[z] < key[y]
then left[y] <- z
else right[y] <- zpython codedef tree_insert( t , z ):
y = None
x = tree_root( t )
while x != None:
y = x
if z.key < x.key:
x = x.left
else:
x = x.right
z.p = y
if y == None:
r = tree_root( t )
r = z
else:
if z.key < y.key:
y.left = z
else:
y.right = z def tree_insert_recrusive( t , z ):
if t.left == None and t.right == None:
if z.key < t.key:
t.left = z
else:
t.right = z
return
if z.key < t.key:
tree_insert_recrusive( t.left , z )
else:
tree_insert_recrusive( t.right , z )pseudo codeTree_Delete( T , z )
if left[z] = NIL or right[z] = NIL
then y <- z
else y <- Tree_Successor( 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 ypython codedef tree_delete( t , z ):
if (z.left == None) or (z.right == None):
y = z
else:
y = tree_successor( z )
if y.left != None:
x = y.left
else:
x = y.right
if x != None:
x.p = y.p
if y.p == None:
r = tree_root( t )
r = x
t = r
else:
if y == y.p.left:
y.p.left = x
else:
y.p.right = x
if y != z:
z.key = y.key
return yExample of usage:Now we can use out tree. There is some more functions like create_tree that creates binary tree from given array. And print_tree that print all ree values.keys = [10,6,1,0,3,8,7,9,21,15,11,17,25,23,46] max_deep = log(len(keys),2)
def create_tree( n=0 , p=None):
if (len(keys) == 0) or (n >= max_deep):
return None
t = Tree()
t.p = p
t.key = keys.pop(0)
t.left = create_tree( n+1 , t )
t.right = create_tree( n+1 , t)
return t
def print_tree( t ):
if (t != None) and (t.key != None):
if t.left == t.right == None:
print "Key:%d "%(t.key)
return
if t.left.key == None:
print "Key:%d Right:%d"%(t.key,t.right.key)
print_tree( t.right )
return
if t.right.key == None:
print "Key:%d Left:%d"%(t.key,t.left.key)
print_tree( t.left )
return
print "Key:%d Left:%d Right:%d"%(t.key,t.left.key,t.right.key)
print_tree( t.left )
print_tree( t.right )
t = create_tree() r = tree_search( t, 10 ) n = Tree() n.key = 150 tree_insert_recrusive( t , n ) inorder_tree_walk( t ) print "" tree_delete( t , r ) inorder_tree_walk( t ) print "" r = tree_root( t ) print r.key
Source