Advertisement
Guest User

Untitled

a guest
May 24th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.98 KB | None | 0 0
  1. def BVS_insert(tree, key):
  2.     """Vlozi novy uzel s klicem 'key' do stromu 'tree'."""
  3.     """
  4.    Nejprve vyhledame misto, kde je jeho rodič, poté porovnáme s hodnotou rodiče a uzel uložíme
  5.    na jemu příslušící místo.
  6.    """
  7.     node = Node()
  8.     node.key = key
  9.  
  10.     x = tree.root
  11.     tmp = None
  12.  
  13.     while x != None:
  14.         tmp = x
  15.         if x.key < key:
  16.             x = x.right
  17.         elif x.key > key:
  18.             x = x.left
  19.  
  20.     node.parent = tmp
  21.  
  22.     if tmp == None:
  23.         tree.root = node
  24.     elif tmp.key > key:
  25.         tmp.left = node
  26.     else:
  27.         tmp.right = node
  28.  
  29.     # Pozn - potřebujeme ukazatel na tento uzel!!! - MODIFIKACE
  30.     return node
  31.  
  32.  
  33. # Viz s220
  34. def insert(tree, key):
  35.     """Vlozi novy uzel s klicem 'key' do stromu 'tree'. Operace zachova
  36.    korektni cerveno-cerny strom.
  37.  
  38.    Pozn:   Základ vkládání nového uzlu je stejný jako v BVS - proto adopce funkce BVS_insert -> modifikace na poslednim řádku
  39.            Problém může nastat při obarvování uzlu -> dojde k porušení vlastností č-č stromu -> musime opravit
  40.  
  41.            Obarvujeme na červeno - černá výška je tedy stále platná,
  42.                        - můžeme porušit 1. vlastnost (kořen nemusí být černý)
  43.                        - můžeme porušit 3. vlastnost (můžeme mit 2 červené uzly spojené přímo hranou
  44.                    - musíme použít korekci
  45.    """
  46.     node = BVS_insert(tree, key)
  47.     node.color = Colors.red
  48.  
  49.     while node != tree.root and node.parent.color == Colors.red:
  50.         if node.parent == node.parent.parent.left:
  51.             d = node.parent.parent.right
  52.             # Oproti pseudokodu na slidech je treba navic kontrolovat ještě, zda uzel není None type!!!
  53.             if d != None and d.color == Colors.red:
  54.                 node.parent.color = Colors.black
  55.                 d.color = Colors.black
  56.                 node.parent.parent.color =  Colors.red
  57.                 node = node.parent.parent
  58.             elif node == node.parent.right:
  59.                 node = node.parent
  60.                 rotate_left(tree, node)
  61.             else:
  62.                 node.parent.color = Colors.black
  63.                 node.parent.parent.color = Colors.red
  64.                 rotate_right(tree, node.parent.parent)
  65.         # Stejně jako první větev IF-podmínky, jen prohozené left a right
  66.         else:
  67.             d = node.parent.parent.left
  68.             if d != None and d.color == Colors.red:
  69.                 node.parent.color = Colors.black
  70.                 d.color = Colors.black
  71.                 node.parent.parent.color = Colors.red
  72.                 node = node.parent.parent
  73.             elif node == node.parent.left:
  74.                 node = node.parent
  75.                 rotate_right(tree, node)
  76.             else:
  77.                 node.parent.color = Colors.black
  78.                 node.parent.parent.color = Colors.red
  79.                 rotate_left(tree, node.parent.parent)
  80.  
  81.     tree.root.color = Colors.black
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement