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