二叉搜索树
首先是一棵二叉树 满足性质:
设x是二叉树的一个节点。如果y是x左子树的一个节点,那么y.key <= x.key
;如果y是x的右子树的一个节点,那么y.key >= x.key
二叉搜索树的操作:查询、插入、删除
插入——构建
class BiTreeNode ( ) :
def __init__ ( self, data) :
self. data = data
self. lchild = None
self. rchild = None
self. parent = None
class BST ( ) :
def __init__ ( self, li= None ) :
self. root = None
if li:
for val in li:
self. insert_no_rec( val)
def insert ( self, node, val) :
if not node:
node = BiTreeNode( val)
elif val < node. data:
node. lchild = self. insert( node. lchild, val)
node. lchild. parent = node
elif val < node. data:
node. rchild = self. insert( node. rchild, val)
node. rchild. parent = node
return node
def insert_no_rec ( self, val) :
p = self. root
if not p:
self. root = BiTreeNode( val)
return
while True :
if val < p. data:
if p. lchild:
p = p. lchild
else :
p. lchild = BiTreeNode( val)
p. lchild. parent = p
return
elif val > p. data:
if p. rchild:
p = p. rchild
else :
p. rchild = BiTreeNode( val)
p. rchild. parent = p
return
else :
return
def pre_order ( self, root) :
if root:
print ( root. data, end= ' ' )
self. pre_order( root. lchild)
self. pre_order( root. rchild)
def in_order ( self, root) :
if root:
self. in_order( root. lchild)
print ( root. data, end= ' ' )
self. in_order( root. rchild)
def post_order ( self, root) :
if root:
self. post_order( root. lchild)
self. post_order( root. rchild)
print ( root. data, end= ' ' )
tree = BST( [ 4 , 6 , 7 , 9 , 2 , 1 , 3 , 5 , 8 ] )
tree. pre_order( tree. root)
print ( )
tree. in_order( tree. root)
tree. post_order( tree. root)
print ( )
查询
def query ( self, node, val) :
if not node:
return None
if val > node. data:
return self. query( node. rchild, val)
elif val < node. data:
return self. query( node. lchild, val)
else :
return node
def query_no_rec ( self, val) :
p = self. root
while p:
if p. data < val:
p = p. rchild
elif val < p. data:
p = p. lchild
else :
return p
return None
删除
如果要删除的节点是叶子节点:直接删除 如果要删除的节点只有一个孩子:将此节点的孩子与父亲连接,然后删除该节点 如果要删除的节点有两个孩子·:将其右子树的最小节点(右子树往左走到头)删除,并替换该节点
def remove_node_1 ( self, node) :
if not node. parent:
self. root = None
if node == node. parent. lchild:
node. parent. lchild = None
else :
node. parent. rchild = None
def remove_node_2_1 ( self, node) :
if not node. parent:
self. root = node. lchild
node. lchild. parent = None
elif node == node. parent. lchild:
node. parent. lchild = node. lchild
node. lchild. parent = node. parent
else :
node. parent. rchild = node. lchild
node. lchild = node. parent
def remove_node_2_2 ( self, node) :
if not node. parent:
self. root = node. rchild
node. rchild. parent = None
elif node == node. parent. lchild:
node. parent. lchild = node. rchild
node. rchild. parent = node. parent
else :
node. parent. rchild = node. rchild
node. rchild = node. parent
def delete ( self, val) :
if self. root:
node = self. query_no_rec( val)
if not node:
return False
if not node. lchild and not node. rchild:
self. remove_node_1( node)
elif not node. rchild:
self. remove_node_2_1( node)
elif not node. lchild:
self. remove_node_2_2( node)
else :
min_node = node. rchild
while min_node. lchild:
min_node = min_node. lchild
node. data = min_node. data
if min_node. rchild:
self. remove_node_2_2( min_node)
else :
self. remove_node_1( min_node)
完整代码
class BiTreeNode ( ) :
def __init__ ( self, data) :
self. data = data
self. lchild = None
self. rchild = None
self. parent = None
class BST ( ) :
def __init__ ( self, li= None ) :
self. root = None
if li:
for val in li:
self. insert_no_rec( val)
def insert ( self, node, val) :
if not node:
node = BiTreeNode( val)
elif val < node. data:
node. lchild = self. insert( node. lchild, val)
node. lchild. parent = node
elif val < node. data:
node. rchild = self. insert( node. rchild, val)
node. rchild. parent = node
return node
def insert_no_rec ( self, val) :
p = self. root
if not p:
self. root = BiTreeNode( val)
return
while True :
if val < p. data:
if p. lchild:
p = p. lchild
else :
p. lchild = BiTreeNode( val)
p. lchild. parent = p
return
elif val > p. data:
if p. rchild:
p = p. rchild
else :
p. rchild = BiTreeNode( val)
p. rchild. parent = p
return
else :
return
def query ( self, node, val) :
if not node:
return None
if val > node. data:
return self. query( node. rchild, val)
elif val < node. data:
return self. query( node. lchild, val)
else :
return node
def query_no_rec ( self, val) :
p = self. root
while p:
if p. data < val:
p = p. rchild
elif val < p. data:
p = p. lchild
else :
return p
return None
def remove_node_1 ( self, node) :
if not node. parent:
self. root = None
if node == node. parent. lchild:
node. parent. lchild = None
else :
node. parent. rchild = None
def remove_node_2_1 ( self, node) :
if not node. parent:
self. root = node. lchild
node. lchild. parent = None
elif node == node. parent. lchild:
node. parent. lchild = node. lchild
node. lchild. parent = node. parent
else :
node. parent. rchild = node. lchild
node. lchild = node. parent
def remove_node_2_2 ( self, node) :
if not node. parent:
self. root = node. rchild
node. rchild. parent = None
elif node == node. parent. lchild:
node. parent. lchild = node. rchild
node. rchild. parent = node. parent
else :
node. parent. rchild = node. rchild
node. rchild = node. parent
def delete ( self, val) :
if self. root:
node = self. query_no_rec( val)
if not node:
return False
if not node. lchild and not node. rchild:
self. remove_node_1( node)
elif not node. rchild:
self. remove_node_2_1( node)
elif not node. lchild:
self. remove_node_2_2( node)
else :
min_node = node. rchild
while min_node. lchild:
min_node = min_node. lchild
node. data = min_node. data
if min_node. rchild:
self. remove_node_2_2( min_node)
else :
self. remove_node_1( min_node)
def pre_order ( self, root) :
if root:
print ( root. data, end= ' ' )
self. pre_order( root. lchild)
self. pre_order( root. rchild)
def in_order ( self, root) :
if root:
self. in_order( root. lchild)
print ( root. data, end= ' ' )
self. in_order( root. rchild)
def post_order ( self, root) :
if root:
self. post_order( root. lchild)
self. post_order( root. rchild)
print ( root. data, end= ' ' )
tree = BST( [ 4 , 6 , 7 , 9 , 2 , 1 , 3 , 5 , 8 ] )
tree. pre_order( tree. root)
print ( )
tree. in_order( tree. root)
print ( )
tree. post_order( tree. root)
print ( )
print ( tree. query_no_rec( 4 ) )
tree. delete( 4 )
tree. in_order( tree. root)