Advertisement
Guest User

Untitled

a guest
May 20th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. #!/bin/env python3
  2.  
  3.  
  4. class NODE_COLOR:
  5.  
  6. RED = 0
  7. BLACK = 1
  8.  
  9.  
  10. class Node(object):
  11.  
  12.  
  13. def __init__(self,value):
  14. self.value = value
  15. self.color = NODE_COLOR.BLACK
  16. self.parent = None
  17.  
  18. self.left = None
  19. self.right = None
  20.  
  21.  
  22. class RBTree(object):
  23.  
  24. def __init__(self, *nodes):
  25. self.root = nodes[0]
  26.  
  27. for node in nodes[1:]:
  28. self.insert(node)
  29.  
  30. """
  31. wrapper used for API
  32. """
  33. def find(self,node):
  34. return self.__find(node,self.root)
  35.  
  36.  
  37. """
  38. Searches for a node in the tree
  39. returns the node if it exists, or None othewise
  40. Impements binary search
  41. """
  42. def __find(self, node, root):
  43. if node is root or root is None:
  44. return root
  45.  
  46. if node.value > root.value:
  47. return self.__find(node,root.right)
  48. else:
  49. return self.__find(node,root.left)
  50.  
  51. def min(slef,root):
  52. if root.left:
  53. return self.min(root.left)
  54. else:
  55. return root
  56.  
  57. def max(self,root):
  58. if root.right:
  59. return self.max(root.right)
  60. else:
  61. return root
  62.  
  63. def remove(self,node):
  64. node = self.find(node,self.root)
  65.  
  66. if node:
  67. if node.right and node.left:
  68. min_child = self.min(node.right)
  69. node = min_child
  70. elif node.right:
  71. node = node.right
  72. elif node.left:
  73. node = node.left
  74. else:
  75. node = None
  76.  
  77. def insert(self,node):
  78. self.__insert(node,self.root)
  79.  
  80.  
  81. def __insert(self,node,root, prev = None):
  82. if root is None:
  83. root = node
  84. if prev:
  85. root.parent = prev
  86. if root.value >= prev.value:
  87. prev.right = root
  88. else:
  89. prev.left = root
  90. else:
  91. self.root = root
  92. elif node.value >= root.value:
  93. return self.__insert(node,root.right,root)
  94. else:
  95. return self.__insert(node,root.left,root)
  96.  
  97. def left_rotate(self,node):
  98. tmp = node.right
  99.  
  100. node.right.left.parent = node
  101. node.right = node.right.left
  102.  
  103. if node.parent:
  104. tmp.parent = node.parent
  105. if node.parent.right is node:
  106. node.parent.right = tmp
  107. else:
  108. node.parent.left = tmp
  109. else:
  110. self.root = tmp
  111.  
  112. node.parent = tmp
  113. tmp.left = node
  114.  
  115. def right_rotate(self,node):
  116. tmp = node.left
  117.  
  118. node.left.right.parent = node
  119. node.left = node.left.right
  120.  
  121. if node.parent:
  122. tmp.parent = node.parent
  123. if node.parent.right is node:
  124. node.parent.right = tmp
  125. else:
  126. node.parent.left = tmp
  127. else:
  128. self.root = tmp
  129.  
  130. node.parent = tmp
  131. tmp.right = node
  132.  
  133.  
  134. def show(self):
  135. self.in_order(self.root)
  136.  
  137. def in_order(self,root):
  138. if root.left:
  139. self.in_order(root.left)
  140. print(root.value)
  141. if root.right:
  142. self.in_order(root.right)
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151. if __name__ == "__main__":
  152. nodes = [Node(15),Node(6),Node(20),Node(9),Node(3),Node(19),Node(45)]
  153. tree = RBTree(*nodes)
  154.  
  155. tree.right_rotate(nodes[0])
  156. tree.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement