Изменения
→Операции
'''func''' insert(key)
Node t = Node(key, red, ''nil'', ''nil'') <font color=green>// конструктор, в который передаем ключ, цвет, левого и правого ребенка </font>
'''if''' root == ''nil''дерево пустое
root = t
t.parent = ''nil''
Node p = root
Node q = ''nil''
'''while''' p != ''nil''<font color=green>// спускаемся вниз, пока не дойдем до подходящего листа </font>
q = p
'''if''' p.key < t.key
p = p.left
t.parent = q
<font color=green>// добавляем новый элемент красного цвета </font>
'''if''' q.key < t.key
q.right = t
'''func''' fixInsertion(t: '''Node''')
'''if''' root == t{{---}} корень t.colour = black
'''return'''
<font color=green>// далее все предки упоминаются относительно t </font> '''while''' t.parent !"отец" красный <font color= ''nil'' '''and''' t.parent.colour == red Node grandfather = t.parent.parent Node uncle = ''nil''green>// нарушается свойство <tex>3</tex> </font> '''if''' grandfather.left == t.parent "отец" {{---}} левый ребенок '''if''' grandfather.right != ''nil'' uncle = grandfather.rightесть "дядя" '''if''' uncle.colour == red <font color=green>// случай, когда "дядя" красный </font> t.parent.colour = black uncle.colour = black grandfather.colour = red
t = grandfather
'''else'''
<font color=green>// случай, когда нет "дяди" </font> '''if''' t.parent.right == t{{---}} правый сын t = t.parent
leftRotate(t)
t = grandfather
'''else'''<font color=green>// нет "дяди" </font> '''if''' t.parent.left == t{{---}} левый ребенок
t = t.parent
rightRotate(t)
leftRotate(grandfather)
root.colour = black <font color=green>// восстанавливаем свойство корня </font>
=== Удаление вершины ===
'''else'''
p = p.left
root = ''nil''
'''else'''
'''return'''
Node y = ''nil''
Node q = ''nil''
'''if''' p.left == ''nil'' '''or''' p.right == ''nil'' <font color=green>// один ребенок</font> ссылку на у от "отца" меняем на ребенка y = p
'''else'''
<font color=green>// два ребенка</font>
'''else'''
у родителя ссылку на y меняем на ссылку на первого ребенка y.parent.right = q
'''if''' y != p
p.colour = y.colour
'''func''' fixDeleting(p: '''Node''')
'''else'''
'''if''' brother.right isBlackправый ребенок "брата" черный <font color=green>// случай, рассматриваемый во втором подпункте:</font> brother.left.colour = black <font color=green>// "брат" красный с черными правым ребенком</font> brother.colour = red
rightRotate(brother)
p = root
'''else''' <font color=green>// p is rightChild {{---}} правый ребенок</font> brother <font color= p.parent.leftgreen>// все случаи аналогичны тому, что рассмотрено выше</font> '''if''' brother isRed"брат" красный brother.colour = black p.parent.colour = red
rightRotate(p.parent)
'''else'''
'''if''' brother.left isBlackлевый ребенок "брата" черный brother.right.colour = black brother.colour = red
leftRotate(brother);
rightRotate(p.parent)
p = root
p.colour = black root.colour = black
=== Объединение красно-чёрных деревьев ===