1. # -*-encoding=utf-8 -*-
    2. import random
    3. class BiTreeNode: #定义二叉树
    4. def __init__(self,data):
    5. self.data=data
    6. self.lchild=None
    7. self.rchild=None
    8. self.parent=None
    9. self.bf=0
    10. class BST:
    11. def __init__(self,li=None): #传一个列表
    12. self.root=None
    13. if li: #构造函数中,列表不为空时,就直接调用非递归方式插入该列表
    14. for val in li:
    15. self.insert_no_rec(val)
    16. def insert(self,node,val): #递归方式插入
    17. if not node:
    18. node=BiTreeNode(val) #如果节点为空,则直接插入节点值
    19. elif val<node.data:
    20. node.lchild=self.insert(node.lchild,val) #插入左孩子
    21. node.lchild.parent=node #将左孩子与父节点连起来
    22. elif val> node.data:
    23. node.rchild=self.insert(node.rchild,val) #插入右孩子
    24. node.rchild.parent=node #将右孩子与父节点连起来
    25. return node
    26. def insert_no_rec(self,val):
    27. p=self.root
    28. if not p: #空树时,直接定义个二叉树根节点
    29. self.root=BiTreeNode(val)
    30. return
    31. while True:
    32. if val<p.data:
    33. if p.lchild: #此处可看出与递归的方式的区别
    34. p=p.lchild
    35. else: #左孩子不存在
    36. p.lchild=BiTreeNode(val)
    37. p.lchild.parent=p
    38. return
    39. elif val>p.data:
    40. if p.rchild:
    41. p=p.rchild
    42. else:
    43. p.rchild=BiTreeNode(val)
    44. p.rchild.parent=p
    45. return
    46. else:
    47. return
    48. def query(self,node,val): #递归查询
    49. if not node:
    50. return None
    51. if node.data<val:
    52. return self.query(node.rchild,val)
    53. elif node.data>val:
    54. return self.query(node.lchild,val)
    55. else:
    56. return node
    57. def query_no_rec(self,val): #非递归查询
    58. p=self.root
    59. while p:
    60. if p.data<val: #如果写成大于后,会报错AttributeError: 'NoneType' object has no attribute 'data'?????
    61. p=p.rchild
    62. elif p.data>val:
    63. p=p.lchild
    64. else:
    65. return p
    66. return None #如果 p为空,则返回空
    67. def pre_order(self,root): # 前序遍历 #放在类里面,需要加self,下面方法调用也一样
    68. if root: # 如果不是空,先访问根,再访问左子树,再访问右子树
    69. print(root.data, end=',')
    70. self.pre_order(root.lchild)
    71. self.pre_order(root.rchild)
    72. def in_order(self,root): # 中序遍历
    73. if root: # 如果不是空,先访问左,再访问根,再访问右
    74. self.in_order(root.lchild)
    75. print(root.data, end=',')
    76. self.in_order(root.rchild)
    77. def post_order(self,root): # 后序遍历
    78. if root: # 如果不是空,先访问左,再访问右,再访问根
    79. self.post_order(root.lchild)
    80. self.post_order(root.rchild)
    81. print(root.data, end=',')
    82. #删除
    83. def __remove_node_1(self,node):
    84. #情况1,node是叶子节点
    85. if not node.parent: #判断是不是根节点
    86. self.root=None
    87. if node==node.parent.lchild:#node是它父亲的左孩子
    88. node.parent.lchild=None
    89. node.parent=None #可写可不写
    90. else: #node是它父亲的右孩子
    91. node.rchild =None
    92. def __remove_node_21(self,node):
    93. #情况2.1:node只有一个左孩子,node的左孩子与node的父节点连起来
    94. if not node.parent: #根节点
    95. self.root=node.lchild
    96. node.lchild.parent=None
    97. elif node==node.parent.lchild:
    98. node.parent.lchild =node.lchild
    99. node.lchild.parent=node.parent
    100. else:
    101. node.parent.rchild=node.lchild
    102. node.lchild.parent=node.parent
    103. def __remove_node_22(self,node):
    104. #情况2.2:node只有一个右孩子,node的右孩子与node的父节点连起来
    105. if not node.parent:
    106. self.root=node.rchild
    107. elif node==node.parent.lchild:
    108. node.parent.lchild=node.rchild
    109. node.rchild.parent=node.parent
    110. else:
    111. node.parent.rchild=node.rchild
    112. node.rchild.parent=node.parent
    113. def delete(self,val):
    114. if self.root: #不是空树
    115. node=self.query_no_rec(val)
    116. if not node: #不存在
    117. return False
    118. if not node.lchild and not node.rchild: #1.叶子节点
    119. self.__remove_node_1(node)
    120. elif not node.rchild: #2.1只有一个左孩子
    121. self.__remove_node_21(node)
    122. elif not node.lchild: #2.2只有一个右孩子
    123. self.__remove_node_22(node)
    124. else:#3.两个孩子都有
    125. min_node=node.rchild
    126. while min_node.lchild:
    127. min_node=min_node.lchild
    128. node.data=min_node.data
    129. #删除min_node
    130. if min_node.rchild:
    131. self.__remove_node_22(min_node)
    132. else:
    133. self.__remove_node_1(min_node)
    134. #1、插入列表,然后前中后遍历
    135. # tree=BST([4,6,7,9,2,1,3,5,8])
    136. # tree.pre_order(tree.root)
    137. # print("")
    138. # tree.in_order(tree.root)
    139. # print("")
    140. # tree.post_order(tree.root)
    141. #2、插入随机列表,然后前中后遍历
    142. # li=list(range(100))
    143. # random.shuffle(li)
    144. # tree=BST(li)
    145. #
    146. # tree.pre_order(tree.root)
    147. # print("")
    148. # tree.in_order(tree.root) #中序一定是递增
    149. # print("")
    150. # tree.post_order(tree.root)
    151. #插入偶数列表后,执行搜索
    152. # li=list(range(0,500,2)) #偶数列表
    153. # random.shuffle(li)
    154. # tree=BST(li)
    155. # print(tree.query_no_rec(4).data) #为何要写成.data ????
    156. # print(tree.query_no_rec(3))
    157. #插入列表后,测试删除后中序遍历结果
    158. # tree=BST([1,4,2,5,3,8,6,9,7])
    159. # tree.in_order(tree.root)
    160. # print("")
    161. # tree.delete(4)
    162. # tree.delete(1)
    163. # tree.delete(8)
    164. # tree.in_order(tree.root)