Изменения

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

Дерево поиска, наивная реализация

222 байта добавлено, 21:39, 2 июня 2015
Нет описания правки
=== Удаление ===
====Нерекурсивная реализация====
Для удаления узла из бинарного дерева поиска нужно рассмотреть три возможные ситуации. Если у узла нет дочерних узлов, то у его родителя нужно просто заменить указатель на <tex>null</tex>. Если у узла есть только один дочерний узел, то нужно создать новую связь между родителем удаляемого узла и его дочерним узлом. Наконец, если у узла два дочерних узла, то нужно найти следующий за ним элемент (у этого элемента не будет левого потомка), его правого потомка подвесить на место найденного элемента, а удаляемый узел заменить найденным узлом (для упрощения реализации, можно использовать функцию, вставляющую узел в дерево, и вставить правый дочерний узел в левое поддерево). Таким образом, свойство бинарного дерева поиска не будет нарушено. Данная реализация удаления не увеличивает высоту дерева. Время работы алгоритма {{---}} <tex>O(h)</tex>.
{| border="1" cellpadding="5" cellspacing="0"
!Случай
v.left.parent = p
'''else''' <font color="green">// третий случай: удаляемый элемент имеет двух потомков</font>
insert successor = next(v, t) v.key = successor.key '''if''' successor.parent.left, v== successor successor.parent.left = successor.right) v'''if''' successor.right != ''null'' successor.right.parent = successor.parent '''else''' successor.parent.right = successor.right '''if''' successor.right != ''null'' delete(t, v) successor.right.parent = successor.parent
====Рекурсивная реализация====
188
правок

Навигация