1. from pprint import pformat
    2. from typing import List
    3. class Node:
    4. def __init__(self,data):
    5. self.data=data
    6. self.left=None
    7. self.right=None
    8. self.parent=None
    9. def __repr__(self):
    10. if self.left is None and self.right is None:
    11. return str(self.data)
    12. return pformat({"%s"%(self.data):(self.left,self.right)},indent=1)
    13. # a=Node(1)
    14. # print(a)
    15. class BST:
    16. def __init__(self):
    17. self.root=None
    18. def is_empty(self):
    19. if self.root is None:
    20. return True
    21. else:
    22. return False
    23. def __insert(self,data):
    24. node=Node(data)
    25. if self.is_empty():
    26. self.root=node
    27. else:
    28. parent_node=self.root
    29. while True:
    30. if data<=parent_node.data:
    31. if parent_node.left is None:
    32. parent_node.left=node
    33. break
    34. else:
    35. parent_node=parent_node.left
    36. if data>parent_node.data:
    37. if parent_node.right is None:
    38. parent_node.right=node
    39. break
    40. else:
    41. parent_node=parent_node.right
    42. node.parent= parent_node
    43. def insert(self,*datas):
    44. for data in datas:
    45. self.__insert(data)
    46. return self
    47. def search(self,data):
    48. if self.is_empty():
    49. raise IndexError("ddd")
    50. else:
    51. node=self.root
    52. while node and node.data!=data:
    53. if data<=node.data:
    54. node=node.left
    55. else:
    56. node=node.right
    57. return node
    58. def is_right(self,node):
    59. return node==node.parent.right
    60. def __reassign_nodes(self,node,new_children):#找父亲,找孩子
    61. if new_children is not None:#如果当前结点子结点不为空
    62. new_children.parent=node.parent#子节点和当前结点互换位置,找父亲
    63. if node.parent is not None:#互换位置后如果当前结点有父结点判断父亲是否为空
    64. if self.is_right(node):#判断删除结点是左还是右,然后孩子代替他
    65. node.parent.right=new_children#找孩子
    66. else:
    67. node.parent.left=new_children#删除根节点
    68. else:
    69. self.root=new_children
    70. def remove(self,data):
    71. if self.root is None:
    72. raise IndexError("空树")
    73. else:
    74. node=self.search(data)#返回值对应的结点
    75. if node:
    76. if node.left is None and node.right is None:
    77. self.__reassign_nodes(node,None)
    78. elif node.left is None:
    79. self.__reassign_nodes(node,node.right)
    80. elif node.right is None:
    81. self.__reassign_nodes(node,node.left)
    82. else:#左右孩子都有
    83. tmp_node=self.get_max(node.left)#找到 左子树的最大结点
    84. self.remove(tmp_node.data)#删除节点
    85. node.data=tmp_node.data#不改变树结构,只改变当前结点值
    86. #-------------------------------------------
    87. # 栈实现前序遍历(8 3 1 6 10)根左右
    88. def preOrderTravers(self,node):
    89. stack=[node]#压栈
    90. while len(stack)>0:
    91. print(node.data)#打印弹出的结点
    92. if node.right:#先进后出,先添加右在添加左
    93. stack.append(node.right)
    94. if node.left:
    95. stack.append(node.left)
    96. node=stack.pop()#弹出结点
    97. # 递归实现前序遍历
    98. def preOrderTravers1(self, node):
    99. if not node:
    100. return None
    101. print(node.data)
    102. self.preOrderTravers1(node.left)
    103. self.preOrderTravers1(node.right)
    104. def preOrderTravers2(self, node):
    105. stack = []
    106. while node or len(stack) > 0:
    107. while node:
    108. print(node.data) # 打印弹出的结点
    109. stack.append(node)
    110. node=node.left
    111. if len(stack)>0:
    112. node = stack.pop() # 弹出结点
    113. node=node.right
    114. # -------------------------------------------
    115. # 中序遍历 左根右 1,3,6,8,10
    116. def in_order_stack(self,node):
    117. stack=[]
    118. # 当结点不为空或栈内有元素
    119. while node or len(stack)>0:
    120. # 当结点不为空
    121. while node:
    122. # 将所有左结点压入栈
    123. stack.append(node)
    124. node=node.left
    125. if len(stack)>0:#当栈不为空
    126. # 弹出栈顶
    127. node=stack.pop()
    128. # 打印栈顶
    129. print(node.data)
    130. # 在判断右边
    131. node=node.right
    132. #递归实现中序遍历
    133. def in_order_stacck1(self,node):
    134. if not node:
    135. return None
    136. else:
    137. self.in_order_stack(node.left)
    138. print(node.data)
    139. self.in_order_stack(node.right)
    140. #-----------------------------
    141. #层序遍历:导入队列的包
    142. def cc(self,root : Node):
    143. from queue import Queue
    144. if self.root is None:
    145. return "empty"
    146. queue=Queue()
    147. queue.put(root)
    148. while not queue.empty():
    149. node=queue.get()
    150. print(node.data)
    151. if node.left:
    152. queue.put(node.left)
    153. if node.right:
    154. queue.put(node.right)
    155. def __str__(self):
    156. return str(self.root)
    157. def get_max(self, node):
    158. if node is None:
    159. node=self.root
    160. if node is not None:
    161. while node.right :
    162. node=node.right
    163. return node
    164. def get_min(self,node):
    165. if node is None:
    166. node=self.root
    167. if not self.is_empty():
    168. while node.left :
    169. node=node.left
    170. return node
    171. # -------------------------
    172. # 俩个栈实现后序遍历:
    173. def post_order_stack(self,node):
    174. if node is None:
    175. return False
    176. else:
    177. stack1=[]
    178. stack2=[]
    179. stack1.append(node)
    180. while stack1:#找出后序遍历的逆序,存放在stack2
    181. node=stack1.pop()
    182. if node.left:
    183. stack1.append(node.left)
    184. if node.right:
    185. stack1.append(node.right)
    186. stack2.append(node)
    187. while stack2:#将stack2 里的元素出站,即为后序遍历
    188. print(stack2.pop().data,end=" ")
    189. #总结版遍历模板:
    190. def inorderTraversal(self,root: Node)->List[int]:
    191. white,gray=0,1
    192. res=[]
    193. stack=[(white,root)]
    194. while stack:
    195. color,node=stack.pop()
    196. if node is None:
    197. continue
    198. if color == white:
    199. # 前序
    200. stack.append((white,node.right))
    201. stack.append((white,node.left))
    202. stack.append((gray,node))
    203. # 中序
    204. stack.append((white, node.right))
    205. stack.append((gray, node))
    206. stack.append((white, node.left))
    207. # 后序
    208. stack.append((gray, node))
    209. stack.append((white, node.right))
    210. stack.append((white, node.left))
    211. else:
    212. return res
    213. # 根节点删除的问题
    214. if __name__ == '__main__':
    215. n=BST().insert(8,3,1,6,10)
    216. # print(n.search(5))\
    217. # n.remove(8)
    218. # n.preOrderTravers(n.root)
    219. # n.preOrderTravers1(n.root)
    220. # n.in_order_stack(n.root)
    221. # n.cc(n.root)
    222. # n.in_order_stacck1(n.root)
    223. n.inorderTraversal(n.root)
    224. print(n)