import random
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.not_digui_insert(val)
def insert(self,node,val):
if not node:
node = BiTreeNode(val)
elif val <node.data:
self.insert(node.lchild,val)
node.lchild.parent = node
elif val>node.data:
self.insert(node.rchild,val)
node.lchild.parent = node
return node
def not_digui_insert(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 look_out(self,node,val):
if not node:
return None
if node.data<val:
return self.look_out(node.rchild,val)
elif node.data>val:
return self.look_out(node.lchild,val)
else:
return node
def no_digui_look_out(self,val):
p = self.root
while p:
if p.data<val:
p = p.rchild
elif p.data>val:
p = p.rchild
else:
return p
else:
return None
def pre_ord(self,root):
if root:
print(root.data,end=',')
self.pre_ord(root.lchild)
self.pre_ord(root.rchild)
def in_ord(self,root):
if root:
self.in_ord(root.lchild)
print(root.data, end=',')
self.in_ord(root.rchild)
def post_ord(self,root):
if root:
self.post_ord(root.lchild)
self.post_ord(root.rchild)
print(root.data, end=',')
def __remove_node_1(self,node):
if not node.parent:
self.root =None
if node == node.parent.lchild:
node.parent.lchild =None
node.parent = None
else:
node.parent.rchild = None
def __remove_node_21(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
def __remove_node_22(self,node):
if not node.parent:
self.root = node.rchild
elif node == node.parent.lchild:
node.parent.lchild = node.rchild
node.rchild.parent = node.parent
else:
node.parent.rchild = node.rchild
node.rchild.parent = node.parent
def delete(self,val):
if self.root:
node = self.no_digui_look_out(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_21(node)
elif not node.lchild:
self.__remove_node_22(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_22(min_node)
else:
self.__remove_node_1(min_node)
tree = BST([1,4,5,3,6,9,10,7])
tree.in_ord(tree.root)
tree.delete(4)
print()
tree.in_ord(tree.root)