Изменения

Перейти к: навигация, поиск

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

860 байт убрано, 16:42, 19 апреля 2018
Псевдокод
root = deleteMax(root);
root.color = BLACK;
'''Node''' moveRedLeft('''Node''' h) colorFlip(h); if (isRed(h.right.left) h.right = rotateRight(h.right); h = rotateLeft(h); colorFlip(h); '''return''' h;  
'''Node''' deleteMax('''Node''' h)
if (isRed(h.left))
h.left = deleteMax(h.left);
//исправление правых красных ссылок и 4-вершин на пути вверх
'''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;
'''void''' deleteMin()
root = deleteMin(root);
root.color = BLACK;
 
'''Node''' deleteMin(h : '''Node''')
//удаляем узел на нижнем уровне(h должен быть красным по инварианту) 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);
 
Delete-the-minimum code for LLRB 2-3 trees
 
'''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)
288
правок

Навигация