188
правок
Изменения
Нет описания правки
Обе операции выполняются за время <tex>O(h)</tex>.
====Реализация без использования информации о родителе====
=== Вставка ===
Операция вставки работает аналогично поиску элемента, только при обнаружении у элемента отсутствия ребенка нужно подвесить на него вставляемый элемент.
====Реализация с использованием информации о родителе====
'''func''' insert(x : '''Node''', z : '''NodeT'''): <font color="green">// x {{---}} корень поддерева, z {{---}} вставляемый элементключ</font> '''if''' z.key > x.key
'''if''' x.right != ''null''
insert(x.right, z)
'''else'''
'''if''' x.left != ''null''
insert(x.left, z)
'''else'''
====Реализация без использования информации о родителе====
'''func''' insert(x : '''Node''', z : '''NodeT'''): <font color="green">// x {{---}} корень поддерева, z {{---}} вставляемый элементключ</font> '''if''' z.key <= x.key '''if''' x.left == ''null'' x.left = Node(z) <font color="green">// подвесим Node с key = z</font> '''elseif'''z < x.key
insert(x.left, z)
'''else''' '''if''' z > x.right == ''null'' x.right = z '''else'''key
insert(x.right, z)
'''if''' p.right == v
p.right = ''null''
'''else''' '''if''' v.left == ''null'' '''or''' v.right == ''null'' <font color="green">// второй случай: удаляемый элемент имеет одного потомка</font> '''if''' v.left == ''null'' '''if''' p.left == v p.left = v.right '''else''' p.right = v.right v.right.parent = p
'''else'''
'''else'''
p.right = v.left v.left.parent = p '''else''' <font color="green">// третий случай: удаляемый элемент имеет двух потомков</font> successor = next(v, t) v.key = successor.key '''if''' successor.parent.left == successor successor.parent.left = successor.right '''if''' successor.right != ''null'' successor.right.parent = successor.parent '''else''' successor.parent.right = successor.right '''if''' successor.right != ''null'' successor.right.parent = successor.parent
====Рекурсивная реализация====
При рекурсивном удаления узла из бинарного дерева нужно рассмотреть три случая: удаляемый элемент находится в левом поддереве текущего поддерева, удаляемый элемент находится в правом поддереве или удаляемый элемент находится в корне. В двух первых случаях нужно рекурсивно удалить элемент из нужного поддерева. Если удаляемый элемент находится в корне текущего поддерева и имеет два дочерних узла, то нужно заменить его минимальным элементом из правого поддерева и рекурсивно удалить минимальный элемент из правого поддерева. Иначе, если удаляемый элемент имеет один дочерний узел, нужно заменить его потомком. Время работы алгоритма {{---}} <tex>O(h)</tex>.
Рекурсивная функция, возвращающая дерево с удаленным элементом <tex>z</tex>:
'''Node''' delete(root : '''Node''', z : '''NodeT'''): <font color="green">// корень поддерева, удаляемый элементключ</font>
'''if''' root == ''null''
'''return''' root
'''if''' z.key < root.key
root.left = remove(root.left, z)
'''else if''' z.key > root.key
root.right = remove(root.right, z)
'''else if''' root.left != ''null'' '''and''' root.right != ''null''