Advertisement
Carotte

arbre test

Nov 6th, 2020
1,935
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.54 KB | None | 0 0
  1. class Node:
  2.  
  3.     def __init__(self, data):
  4.         self.data = data
  5.         self.left = None
  6.         self.right = None
  7.         self.parent = None
  8.  
  9.     def __str__(self):
  10.         return str(self.data)
  11.  
  12.     def __iter__(self):
  13.         if self.left:
  14.             for node in self.left:
  15.                 yield node
  16.         yield self.data
  17.         if self.right:
  18.             for node in self.right:
  19.                 yield node
  20.  
  21.     def __getitem__(self, key):
  22.         node = self.get(key)
  23.         if node:
  24.             return node
  25.         raise KeyError(key)
  26.  
  27.     def get(self, data):
  28.         if data < self.data:
  29.             return self.left.get(data) if self.left else None
  30.         elif data > self.data:
  31.             return self.right.get(data) if self.right else None
  32.         return self
  33.  
  34.     def insert(self, data):
  35.         if data < self.data:
  36.             if self.left is None:
  37.                 self.left = Node(data)
  38.                 self.left.parent = self
  39.             else:
  40.                 self.left.insert(data)
  41.         elif data > self.data:
  42.             if self.right is None:
  43.                 self.right = Node(data)
  44.                 self.right.parent = self
  45.             else:
  46.                 self.right.insert(data)
  47.  
  48.     def is_left_child(self):
  49.         return self.parent and self is self.parent.left
  50.  
  51.     def is_right_child(self):
  52.         return self.parent and self is self.parent.right
  53.  
  54.     def count_children(self):
  55.         return bool(self.left) + bool(self.right)
  56.  
  57.     def max(self):
  58.         node = self
  59.         while node.right:
  60.             node = node.right
  61.         return node
  62.  
  63.     def min(self):
  64.         node = self
  65.         while node.left:
  66.             node = node.left
  67.         return node
  68.  
  69.     def get_successor(self):
  70.         if self.right:
  71.             return self.right.min()
  72.         node = self
  73.         while node.is_right_child():
  74.             node = node.parent
  75.         return node.parent
  76.  
  77.     def get_predecessor(self):
  78.         if self.left:
  79.             return self.left.max()
  80.         node = self
  81.         while node.is_left_child():
  82.             node = node.parent
  83.         return node.parent
  84.  
  85.     def delete(self, data):
  86.  
  87.         node = self.get(data)
  88.  
  89.         if not node:
  90.             return
  91.  
  92.         children_count = node.count_children()
  93.  
  94.         if children_count == 0:
  95.             # Node has no children: remove it.
  96.             # Fix references.
  97.             if node.is_left_child():
  98.                 node.parent.left = None
  99.             else:
  100.                 node.parent.right = None
  101.             del node
  102.  
  103.         elif children_count == 1:
  104.             # Node has 1 child: replace it by its child.
  105.             child = node.left or node.right
  106.             if node.is_left_child():
  107.                 # Remove `node` from the tree by fixing references.
  108.                 node.parent.left = child
  109.                 child.parent = node.parent
  110.                 del node
  111.             elif node.is_right_child():
  112.                 # Remove `node` from the tree by fixing references.
  113.                 node.parent.right = child
  114.                 child.parent = node.parent
  115.                 del node
  116.             else:
  117.                 # If there is no parent, we are at the root.
  118.                 root = node
  119.                 root.data = child.data
  120.                 # Remove `child` from the tree by fixing references.
  121.                 root.left = child.left
  122.                 root.right = child.right
  123.                 if child.left:
  124.                     child.left.parent = root
  125.                 if child.right:
  126.                     child.right.parent = root
  127.                 del child
  128.  
  129.         else:
  130.             # Node has 2 children: replace it by its successor.
  131.             # Because the node has 2 children, its successor is guaranteed to
  132.             # be somewhere on its right side. If the successor has children,
  133.             # they can only be on the right side.
  134.             succ = node.get_successor()
  135.             node.data = succ.data
  136.             # Remove `succ` from the tree by fixing references.
  137.             if succ.is_left_child():
  138.                 succ.parent.left = succ.right
  139.             else:
  140.                 succ.parent.right = succ.right
  141.             if succ.right:
  142.                 succ.right.parent = succ.parent
  143.             del succ
  144.  
  145.     def pprint(self, level=0):
  146.         if self.right:
  147.             self.right.pprint(level + 1)
  148.         print(f"{' ' * 4 * level}{self.data}")
  149.         if self.left:
  150.             self.left.pprint(level + 1)
  151.  
  152.     def get_height(self):
  153.         return 1 + max(
  154.             self.left.get_height() if self.left else -1,
  155.             self.right.get_height() if self.right else -1
  156.         )
  157.  
  158.     def _check_balance(self):
  159.         left = self.left._check_balance() if self.left else -1
  160.         right = self.right._check_balance() if self.right else -1
  161.         if abs(left - right) > 1:
  162.             raise ValueError('Unbalanced tree.')
  163.         return max(left, right) + 1
  164.  
  165.     def is_balanced(self):
  166.         try:
  167.             self._check_balance()
  168.             return True
  169.         except ValueError:
  170.             return False
  171.  
  172.     def is_valid(self):
  173.         prev = None
  174.         for data in self:
  175.             if prev and prev > data:
  176.                 return False
  177.             prev = data
  178.         return True
  179.  
  180. bst = Node(23)
  181. bst.insert(6)
  182. bst.insert(14)
  183. bst.insert(3)
  184. bst.insert(8)
  185. bst.insert(25)
  186. bst.insert(5)
  187. bst.insert(1)
  188. bst.insert(150)
  189. bst.insert(99)
  190. bst.insert(7)
  191. bst.insert(9)
  192. bst.insert(10)
  193. bst.insert(11)
  194. bst.insert(13)
  195.  
  196. bst.pprint()
  197.  
  198. print(bst.is_valid())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement