Левосторонние красно-чёрные деревья

Материал из Викиконспекты
Перейти к: навигация, поиск
 Определение

|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)