Левосторонние красно-чёрные деревья — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Методы)
Строка 41: Строка 41:
 
       '''Node''' insert( h : '''Node''', key : '''Key''', value : '''Value'''):
 
       '''Node''' insert( h : '''Node''', key : '''Key''', value : '''Value'''):
 
           '''if''' h == null     
 
           '''if''' h == null     
              '''return''' '''new''' Node(key, value)
+
              '''return''' '''new''' Node(key, value)
 
           '''if''' isRed(h.left) '''&&''' isRed(h.right)
 
           '''if''' isRed(h.left) '''&&''' isRed(h.right)
              colorFlip(h)
+
              colorFlip(h)
 
           '''int''' cmp = key.compareTo(h.key)  
 
           '''int''' cmp = key.compareTo(h.key)  
 
           '''if'''  cmp == 0
 
           '''if'''  cmp == 0
              h.val = value
+
                  h.val = value
 
           '''else'''  
 
           '''else'''  
 
               '''if''' cmp < 0  
 
               '''if''' cmp < 0  
                  h.left = insert(h.left, key, value)   
+
                      h.left = insert(h.left, key, value)   
 
               '''else'''  
 
               '''else'''  
                  h.right = insert(h.right, key, value)
+
                      h.right = insert(h.right, key, value)
 
           '''if''' isRed(h.right) '''&&''' !isRed(h.left)     
 
           '''if''' isRed(h.right) '''&&''' !isRed(h.left)     
              h = rotateLeft(h)
+
                  h = rotateLeft(h)
 
           '''if''' isRed(h.left) '''&&''' isRed(h.left.left)
 
           '''if''' isRed(h.left) '''&&''' isRed(h.left.left)
              h = rotateRight(h)
+
                  h = rotateRight(h)
 
       '''return''' ''h''
 
       '''return''' ''h''
 
</code>
 
</code>
Строка 64: Строка 64:
 
   while (x != null)
 
   while (x != null)
 
       '''int''' cmp = key.compareTo(x.key)
 
       '''int''' cmp = key.compareTo(x.key)
       if cmp == 0) '''return''' x.val
+
       '''if''' cmp == 0
          else
+
          '''return''' x.val
              if cmp < 0)
+
      '''else'''
                  x = x.left
+
          '''if''' cmp < 0
                  else  
+
                x = x.left
                      if cmp > 0)
+
          '''else'''
                          x = x.right
+
              '''if''' cmp > 0  
          '''return''' null
+
                    x = x.right
 +
    '''return''' null
 
</code>
 
</code>
 +
 
==Удаление==
 
==Удаление==
 
<code>
 
<code>

Версия 02:20, 8 декабря 2017

 Определение

|definition = Left-leaning Red-Black Trees .

Вращения

  Node rotateRight(h : Node):
  x = h.left
  h.left= x.right
  x.right= h
  x.color = h.color
  h.color = RED
   return x

  Node rotateLeft(h : Node):
  x = h.right
  h.right = x.left
  x.left = h
  x.color = h.color
  h.color = RED
  return x

 void flipColors(h : Node h):
  h.color = !h.color
  h.left.color =  !h.left.color
  h.right.color = !h.right.color

Методы

  void insert( key : Key, value : Value ): 
   root = insert(root, key, value)
    root.color = BLACK

     Node insert( h : Node, key : Key, value : Value):
          if h == null     
              return new Node(key, value)
          if isRed(h.left) && isRed(h.right)
              colorFlip(h)
          int cmp = key.compareTo(h.key) 
          if  cmp == 0
                 h.val = value
          else 
              if cmp < 0 
                     h.left = insert(h.left, key, value)  
              else 
                     h.right = insert(h.right, key, value)
          if isRed(h.right) && !isRed(h.left)    
                 h = rotateLeft(h)
          if isRed(h.left) && isRed(h.left.left)
                 h = rotateRight(h)
     return h

  Value search(key : Key):
  Node x = root
  while (x != null)
      int cmp = key.compareTo(x.key)
      if cmp == 0
          return x.val
      else
          if cmp < 0
                x = x.left
          else 
             if cmp > 0 
                    x = x.right
   return null

Удаление

void deleteMin():
  root = deleteMin(root)
  root.color = BLACK

Node deleteMin( h : Node):
  if h.left == null
     return null
  if !isRed(h.left) && !isRed(h.left.left)
     h = moveRedLeft(h)
  h.left = deleteMin(h.left)
  return fixUp(h)

   Node moveRedLeft(Node h):

  colorFlip(h):
  if isRed(h.right.left)
   
     h.right = rotateRight(h.right)
     h = rotateLeft(h)
     colorFlip(h)

 return h  

    Node’’’ moveRedRight(h :Node ):
   colorFlip(h)
   if isRed(h.left.left))
    
      h = rotateRight(h)
      colorFlip(h)
    
 return h  

void delete(key : Key):
  root = delete(root, key)
  root.color = BLACK

  Node delete(Node : h, Key : key):
   if key.compareTo(h.key) < 0)     
          if !isRed(h.left) && !isRed(h.left.left)
               h = moveRedLeft(h)
           h.left =  delete(h.left, key)
        else  
 if isRed(h.left)
   h = rotateRight(h)
 if key.compareTo(h.key) == 0 && (h.right == null)
   return null
 if !isRed(h.right) && !isRed(h.right.left)
   h = moveRedRight(h)
 if key.compareTo(h.key) == 0
       h.val = get(h.right, min(h.right).key)
       h.key = min(h.right).key
       h.right = deleteMin(h.right)
 else 
   h.right = delete(h.right, key)
 return fixUp(h)