Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.17 KB | None | 0 0
  1. class Binary_Search_Tree:
  2.  
  3. class __BST_Node:
  4.  
  5. def __init__(self, value):
  6. self.value = value
  7. self.left=None
  8. self.right=None
  9. self.height=0
  10.  
  11. def __init__(self):
  12. self.__root = None
  13.  
  14. def insert_element(self, value):
  15. self.__root=self.__recursive_insert(value,self.__root)
  16.  
  17. def __recursive_insert(self,value,node):
  18. if node is not None:
  19. if value<node.value:
  20. node.left=self.__recursive_insert(value,node.left)
  21. elif value>node.value:
  22. node.right=self.__recursive_insert(value,node.right)
  23. else:
  24. raise ValueError
  25. else:
  26. node=self.__BST_Node(value)
  27. self.__update_node_height(node)
  28. return self.__balance(node)
  29.  
  30. def remove_element(self, value):
  31. self.__root=self.__recursive_remove(value,self.__root)
  32.  
  33. def __recursive_remove(self,value,node):
  34. if node is not None:
  35. if value<node.value:
  36. node.left = self.__recursive_remove(value,node.left)
  37. self.__update_node_height(node)
  38. elif value>node.value:
  39. node.right = self.__recursive_remove(value,node.right)
  40. self.__update_node_height(node)
  41. else:
  42. if node.left is None and node.right is None:
  43. node=None
  44. elif node.left is None:
  45. node=node.right
  46. elif node.right is None:
  47. node=node.left
  48. else:
  49. min_right_value=self.__recursive_find_right_subtree_min(node.right)
  50. node.right=self.__recursive_remove(min_right_value,node.right)
  51. node.value=min_right_value
  52. return self.__balance(node)
  53. raise ValueError
  54.  
  55. def __recursive_find_right_subtree_min(self,node):
  56. if node.left is not None:
  57. return self.__recursive_find_right_subtree_min(node.left)
  58. return node.value
  59.  
  60. def in_order(self):
  61. if self.__root is None:
  62. return "[ ]"
  63. init_string=self.__recursive_inorder(self.__root)
  64. init_string=init_string[:-2]
  65. return_string= "[ "+init_string+" ]"
  66. return return_string
  67.  
  68. def __recursive_inorder(self,node):
  69. if node is None:
  70. return ""
  71. elif node.left is None and node.right is None:
  72. return str(node.value) +", "
  73. else:
  74. return self.__recursive_inorder(node.left)+str(node.value)+", "+self.__recursive_inorder(node.right)
  75.  
  76. def pre_order(self):
  77. if self.__root is None:
  78. return "[ ]"
  79. init_string=self.__recursive_preorder(self.__root)
  80. init_string=init_string[:-2]
  81. return_string= "[ "+init_string+" ]"
  82. return return_string
  83.  
  84. def __recursive_preorder(self,node):
  85. if node is None:
  86. return ""
  87. elif node.left is None and node.right is None:
  88. return str(node.value) + ", "
  89. else:
  90. return str(node.value)+", "+self.__recursive_preorder(node.left)+self.__recursive_preorder(node.right)
  91.  
  92. def post_order(self):
  93. if self.__root is None:
  94. return "[ ]"
  95. init_string=self.__recursive_postorder(self.__root)
  96. init_string=init_string[1:]
  97. return_string= "["+init_string+" ]"
  98. return return_string
  99.  
  100. def __recursive_postorder(self,node):
  101. if node is None:
  102. return ""
  103. if node.left is None and node.right is None:
  104. return ", "+str(node.value)
  105. else:
  106. return self.__recursive_postorder(node.left)+self.__recursive_postorder(node.right)+", "+str(node.value)
  107.  
  108. def get_height(self):
  109. if self.__root is None:
  110. return 0
  111. return self.__root.height
  112.  
  113. def __update_node_height(self,node):
  114. if node.left is None and node.right is not None:
  115. node.height=node.right.height+1
  116. elif node.right is None and node.left is not None:
  117. node.height=node.left.height+1
  118. elif node.left is not None and node.right is not None:
  119. if node.right.height>=node.left.height:
  120. node.height=node.right.height+1
  121. else:
  122. node.height=node.left.height+1
  123. else:
  124. node.height=1
  125.  
  126. def __str__(self):
  127. return self.in_order()
  128.  
  129. def __balance(self,node):
  130. if node is not None:
  131. if self.__get_subtree_balance(node)>1:
  132. if self.__get_subtree_balance(node.right)<0:
  133. node.right=self.__rotate_right(node.right,node.right.left)
  134. node=self.__rotate_left(node,node.right)
  135. elif self.__get_subtree_balance(node)<-1:
  136. if self.__get_subtree_balance(node.left)>0:
  137. node.left=self.__rotate_left(node.left,node.left.right)
  138. node=self.__rotate_right(node,node.left)
  139. self.__update_node_height(node)
  140. return node
  141.  
  142. def __get_subtree_balance(self,node):
  143. right_subtree_height=0
  144. left_subtree_height=0
  145. if node.right is not None:
  146. right_subtree_height=node.right.height
  147. if node.left is not None:
  148. left_subtree_height=node.left.height
  149. return right_subtree_height-left_subtree_height
  150.  
  151. def __rotate_left(self,root_node,node):
  152. root_node.right=node.left
  153. node.left=root_node
  154. self.__update_node_height(root_node)
  155. self.__update_node_height(node)
  156. return node
  157.  
  158. def __rotate_right(self,root_node,node):
  159. root_node.left=node.right
  160. node.right=root_node
  161. self.__update_node_height(root_node)
  162. self.__update_node_height(node)
  163. return node
  164.  
  165. def to_list(self):
  166. if self.__root is None:
  167. return []
  168. return self.__recursive_to_list(self.__root)
  169.  
  170. def __recursive_to_list(self,node):
  171. if node is None:
  172. return []
  173. return self.__recursive_to_list(node.left)+[node.value]+self.__recursive_to_list(node.right)
  174.  
  175. # if __name__ == '__main__':
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement