Изменения

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

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

573 байта убрано, 20:55, 2 июня 2015
Нет описания правки
Обе операции выполняются за время <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
parent successor = current
current = current.left
'''else'''
current = current.right
'''return''' parentsuccessor
=== Вставка ===
Операция вставки работает аналогично поиску элемента, только при обнаружении у элемента отсутствия ребенка нужно подвесить на него вставляемый элемент.
insert(v.left, v.right)
v.right = ''null''
'''if''' v.parent == ''null'' delete(t = v.left; '''else if''' v.parent.left == v v.parent.left = v.left '''else''' v.parent.right = , v.left)
====Рекурсивная реализация====
'''Node''' delete(root : '''Node''', z : '''T'''): <font color="green">// корень поддерева, удаляемый ключ</font>
'''if''' root == ''null''
'''return''' root
'''if''' z < root.key
root.left = remove(root.left, z)
'''else if''' z > root.key
root.right = remove(root.right, z)
'''else if''' root.left != ''null'' '''and''' root.right != ''null''
root.key = minimum(root.right).key root.right = remove(root, root.right)
'''else'''
'''if''' root.left != ''null'' root = t.left '''else''' root = t.right
'''return''' root
188
правок

Навигация