python实现二叉搜索树

深碍√TFBOYSˉ_ 2022-05-30 08:51 246阅读 0赞
  1. class Node(object):
  2. def __init__(self,data=None):
  3. self._left=None #左节点
  4. self._right=None #右节点
  5. self._data=data
  6. #一系列get set方法
  7. def set_left(self,node):
  8. self._left=node
  9. def set_right(self,node):
  10. self._right=node
  11. def get_left(self):
  12. return self._left
  13. def get_right(self):
  14. return self._right
  15. def set_data(self,data):
  16. self._data=data
  17. def get_data(self):
  18. return self._data
  19. class Binary_tree(object):
  20. def __init__(self,root):#这个根要是Node的对象
  21. self.__in_order=[]#中序遍历的列表
  22. self.__pre_order=[]#前序遍历的列表
  23. self.__post_order=[]#后序遍历的列表
  24. self.__root=root
  25. #下面带有help的都是私有函数
  26. def __preorder_help(self,root):#利用递归进行前序遍历
  27. if root:
  28. self.__pre_order.append(root.get_data())
  29. self.__preorder_help(root.get_left())
  30. self.__preorder_help(root.get_right())
  31. return self.__pre_order
  32. def __inorder_help(self,root):#利用递归进行中序遍历
  33. if root:
  34. self.__inorder_help(root.get_left())
  35. self.__in_order.append(root.get_data())
  36. self.__inorder_help(root.get_right())
  37. return self.__in_order
  38. def __postorder_help(self,root):#利用递归进行后序遍历
  39. if root:
  40. self.__postorder_help(root.get_left())
  41. self.__postorder_help(root.get_right())
  42. self.__post_order.append(root.get_data)
  43. return self.__post_order
  44. def preorder(self):
  45. return self.__preorder_help(self.__root)
  46. def inorder(self):
  47. return self.__inorder_help(self.__root)
  48. def postorder(self):
  49. return self.__postorder_help(self.__root)
  50. #貌似纯二叉树没什么卵用,就不写示列了。
  51. #二叉搜索树就不一样了,下面会有示列。
  52. class BSTNode(Node):
  53. def __init__(self,data=None):
  54. Node.__init__(self,data=data)#这继承不像c++,不会默认调用父类的构造函数,需要像这样写
  55. self.__in_order=[]#中序遍历的列表
  56. self.__pre_order=[]#前序遍历的列表
  57. self.__post_order=[]#后序遍历的列表
  58. def insert(self,data):
  59. if data<self._data:#比此数据小就插左边,否则就插右边
  60. if self._left:
  61. return self._left.insert(data)
  62. else:
  63. self._left=BSTNode(data)
  64. else:
  65. if self._right:
  66. return self._right.insert(data)
  67. else:
  68. self._right=BSTNode(data)
  69. @staticmethod#静态方法
  70. def min_val_bst_node(bst_node):
  71. current=bst_node
  72. while current._left is not None:
  73. current=current._left
  74. return current
  75. def delete(self,data):
  76. if self is None:#发现没有这个数据时做以下处理
  77. return None
  78. if data<self._data:#要删的数据比此数据小,就从左子树删起
  79. self._left=self._left.delete(data)
  80. elif data>self.get_data():#要删的数据比此数据大,从右子树删起
  81. self._right=self._right.delete(data)
  82. else:#要删的就是此数据
  83. if self._left is None:#当左子树为空时,返回右子树,那么这个数据就删掉了,返回上层的时候,它的父节点与右子树相连
  84. temp=self._right
  85. return temp
  86. elif self._right is None:#当右子树为空,与上面相似
  87. temp=self._left
  88. return temp
  89. #如果左右子树都不为空时,把右子树的最左节点(最小结点)和此结点的数据替换
  90. temp = self.min_val_bst_node(self._right)
  91. self._data=temp._data
  92. self._right=self._right.delete(temp._data)
  93. return self
  94. def find(self,data):
  95. if data==self.get_data():
  96. return True
  97. elif data<self.get_data():#小就往左子树找,大就往右子树找
  98. if self._left:
  99. return self._left.find(data)
  100. else:
  101. return False
  102. else:
  103. if self.get_right():
  104. return self._right.find(data)
  105. else:
  106. return False
  107. #下面这些函数与纯二叉树的类似
  108. def inorder(self,root):
  109. if root:
  110. self.inorder(root._left)
  111. self.__in_order.append(root._data)
  112. self.inorder(root._right)
  113. return self.__in_order
  114. def preorder(self,root):
  115. if root:
  116. self.__pre_order.append(root._data)
  117. self.preorder(root._left)
  118. self.preorder(root._right)
  119. return self.__pre_order
  120. def postorder(self,root):
  121. if root:
  122. self.postorder(root._left)
  123. self.postorder(root._right)
  124. self.__post_order.append(root._data)
  125. return self.__post_order
  126. class BST(object):
  127. def __init__(self):
  128. self.__root=None
  129. def insert(self,data):
  130. if self.__root:
  131. self.__root.insert(data)
  132. else:
  133. self.__root = BSTNode(data)
  134. def delete(self,data):
  135. if self.__root:
  136. return self.__root.delete(data)
  137. def find(self,data):
  138. if self.__root:
  139. return self.__root.find(data)
  140. else:
  141. return False
  142. def preorder(self):
  143. if self.__root:
  144. return self.__root.preorder(self.__root)
  145. def inorder(self):
  146. if self.__root:
  147. return self.__root.inorder(self.__root)
  148. def postorder(self):
  149. if self.__root:
  150. return self.__root.postorder(self.__root)
  151. def __numbers_of_nodes_help(self,root):
  152. if root:
  153. return self.__numbers_of_nodes_help(root._left)+self.__numbers_of_nodes_help(root._right)+1
  154. else:
  155. return 0
  156. def numbers_of_nodes(self):
  157. return self.__numbers_of_nodes_help(self.__root)
  158. my_list=[8,5,10,2,6,9,11]
  159. bst=BST()
  160. for e in my_list:
  161. bst.insert(e)
  162. print("中序遍历:",bst.inorder())
  163. print("后序遍历:",bst.postorder())
  164. print("前序遍历:",bst.preorder())
  165. print("结点数:",bst.numbers_of_nodes())
  166. #剩下的功能可以自己尝试

输出:

  1. 中序遍历: [2, 5, 6, 8, 9, 10, 11]
  2. 后序遍历: [2, 6, 5, 9, 11, 10, 8]
  3. 前序遍历: [8, 5, 2, 6, 10, 9, 11]
  4. 结点数: 7

对了,那个二叉搜索树的图是这样的:

20180308180045166

发表评论

表情:
评论列表 (有 0 条评论,246人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python实现搜索

    1、什么是二叉搜索 二叉搜索是在一个有序的列表中,寻找目标元素。因此我们需要对半查找即可。当目标元素比中间元素小,则在中间元素的左边查找;反之,则在目标元素的右边查找。直

    相关 搜索实现

    本文给出二叉搜索树介绍和实现 首先说它的性质:所有的节点都满足,左子树上所有的节点都比自己小,右边的都比自己大。 那这个结构有什么有用呢? 首先可以快速二分查找。还可以中

    相关 搜索

    二叉搜索树 基本概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

    相关 java实现搜索

    二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。定义如下 > (1)若左子树不空,则左子树上所有结点的