# -*-encoding=utf-8 -*-import randomclass BiTreeNode: #定义二叉树 def __init__(self,data): self.data=data self.lchild=None self.rchild=None self.parent=None self.bf=0class 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 node.data<val: return self.query(node.rchild,val) elif node.data>val: return self.query(node.lchild,val) else: return node def query_no_rec(self,val): #非递归查询 p=self.root while p: if p.data<val: #如果写成大于后,会报错AttributeError: 'NoneType' object has no attribute 'data'????? p=p.rchild elif p.data>val: p=p.lchild else: return p return None #如果 p为空,则返回空 def pre_order(self,root): # 前序遍历 #放在类里面,需要加self,下面方法调用也一样 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=',') #删除 def __remove_node_1(self,node): #情况1,node是叶子节点 if not node.parent: #判断是不是根节点 self.root=None if node==node.parent.lchild:#node是它父亲的左孩子 node.parent.lchild=None node.parent=None #可写可不写 else: #node是它父亲的右孩子 node.rchild =None def __remove_node_21(self,node): #情况2.1:node只有一个左孩子,node的左孩子与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.parent=node.parent def __remove_node_22(self,node): #情况2.2:node只有一个右孩子,node的右孩子与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.query_no_rec(val) if not node: #不存在 return False if not node.lchild and not node.rchild: #1.叶子节点 self.__remove_node_1(node) elif not node.rchild: #2.1只有一个左孩子 self.__remove_node_21(node) elif not node.lchild: #2.2只有一个右孩子 self.__remove_node_22(node) else:#3.两个孩子都有 min_node=node.rchild while min_node.lchild: min_node=min_node.lchild node.data=min_node.data #删除min_node if min_node.rchild: self.__remove_node_22(min_node) else: self.__remove_node_1(min_node)#1、插入列表,然后前中后遍历# 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)#2、插入随机列表,然后前中后遍历# li=list(range(100))# random.shuffle(li)# tree=BST(li)## tree.pre_order(tree.root)# print("")# tree.in_order(tree.root) #中序一定是递增# print("")# tree.post_order(tree.root)#插入偶数列表后,执行搜索# li=list(range(0,500,2)) #偶数列表# random.shuffle(li)# tree=BST(li)# print(tree.query_no_rec(4).data) #为何要写成.data ????# print(tree.query_no_rec(3))#插入列表后,测试删除后中序遍历结果# tree=BST([1,4,2,5,3,8,6,9,7])# tree.in_order(tree.root)# print("")# tree.delete(4)# tree.delete(1)# tree.delete(8)# tree.in_order(tree.root)