Advertisement
wtmhahagd

bst

Nov 1st, 2016
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.66 KB | None | 0 0
  1. class Binary_Search_Tree:
  2. class _BST_Node:
  3. def __init__(self, value):
  4. self._value = value
  5. self._left = None
  6. self._right = None
  7.  
  8. def __init__(self):
  9. self._root = None
  10. # self._height = 0
  11.  
  12. def insert_element(self, value):
  13. if self._root is None:
  14. self._root = self._BST_Node(value)
  15. else:
  16. self.insertRecursive(value, self._root)
  17.  
  18. def insertRecursive(self, value, node):
  19. if value < node._value:
  20. if node._left is None:
  21. node._left = self._BST_Node(value)
  22. else:
  23. node._left = self.insertRecursive(value, node._left);
  24. if value > node._value:
  25. if node._right is None:
  26. node._right = self._BST_Node(value)
  27. else:
  28. node._right = self.insertRecursive(value, node._right);
  29. return node
  30.  
  31. def remove_element(self, value):
  32. if self._root is None:
  33. return
  34. self.removeRecursive(value, self._root)
  35.  
  36. def removeRecursive(self, value, node):
  37. print('trying to remove value ' + str(value))
  38. print(' from subtree rooted at ' + str(node._value))
  39.  
  40. if node is None:
  41. return None
  42.  
  43. isRoot = value == self._root._value
  44. if value == node._value:
  45. if node._left is None and node._right is None:
  46. if isRoot:
  47. self._root = None
  48. return None
  49. if node._left is None:
  50. if isRoot:
  51. self._root = node._right
  52. return node._right
  53. if node._right is None:
  54. if isRoot:
  55. self._root = node._left
  56. return node._left
  57. else:
  58. # case of two children
  59.  
  60. # in the spirit of recursion, and nothing more...
  61. swapNode = self.smallestNodeOfSubtree(node._right);
  62.  
  63. node._value = swapNode._value
  64. self.removeRecursive(swapNode._value, node._right);
  65. if value < node._value:
  66. node._left = self.removeRecursive(value, node._left);
  67. if value > node._value:
  68. node._right = self.removeRecursive(value, node._right);
  69. return node
  70.  
  71. def smallestNodeOfSubtree(self, subtree):
  72. if subtree._left is None:
  73. return subtree
  74. else:
  75. return self.smallestNodeOfSubtree(subtree._left);
  76.  
  77. def in_order(self):
  78. if self._root is None:
  79. return '[ ]'
  80. return '[ ' + self.inOrderRec(self._root)[:-1] + ' ]'
  81. pass
  82.  
  83. def pre_order(self):
  84. if self._root is None:
  85. return '[ ]'
  86. return '[ ' + self.preOrderRec(self._root)[:-1] + ' ]'
  87. pass
  88.  
  89. def post_order(self):
  90. if self._root is None:
  91. return '[ ]'
  92. return '[ ' + self.postOrderRec(self._root)[:-1] + ' ]'
  93. pass
  94.  
  95. # sorry :-1
  96.  
  97. def get_height(self):
  98. pass
  99.  
  100. def __str__(self):
  101. return self.in_order()
  102.  
  103. def inOrderRec(self, node):
  104. string = ''
  105. if node._left is not None:
  106. string += self.inOrderRec(node._left)
  107.  
  108. string += str(node._value) + ' '
  109.  
  110. if node._right is not None:
  111. string += self.inOrderRec(node._right)
  112. return string
  113.  
  114. def preOrderRec(self, node):
  115. string = ''
  116. string += str(node._value) + ' '
  117.  
  118. if node._left is not None:
  119. string += self.preOrderRec(node._left)
  120.  
  121. if node._right is not None:
  122. string += self.preOrderRec(node._right)
  123. return string
  124.  
  125. def postOrderRec(self, node):
  126. string = ''
  127. if node._left is not None:
  128. string += self.postOrderRec(node._left)
  129.  
  130. if node._right is not None:
  131. string += self.postOrderRec(node._right)
  132.  
  133. string += str(node._value) + ' '
  134. return string
  135.  
  136. if __name__ == '__main__':
  137. pass #unit tests make the main section unnecessary.
  138.  
  139. tree = Binary_Search_Tree();
  140. tree.insert_element(20);
  141. tree.insert_element(10);
  142. tree.insert_element(40);
  143. tree.insert_element(5);
  144. tree.insert_element(12);
  145. tree.insert_element(11);
  146. tree.insert_element(18);
  147. tree.insert_element(19);
  148. tree.insert_element(39);
  149. tree.insert_element(41);
  150. print(tree);
  151. tree.remove_element(12);
  152. print(tree);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement