355
правок
Изменения
Нет описания правки
== Операции в бинарном дереве поиска ==
=== Обход дерева поиска ===
=== Поиск элемента ===
[[Файл:Bst search.png|thumb|318px|Поиск элемента 4]]
Для поиска элемента в бинарном дереве поиска можно воспользоваться следующей процедурой, которая принимает в качестве параметров корень дерева и искомый ключ. Для каждого узла функция сравнивает значение его ключа с искомым ключом. Если ключи одинаковы, то функция возвращает текущий узел, в противном случае функция вызывается рекурсивно для левого или правого поддерева. Узлы, которые посещает функция образуют нисходящий путь от корня, так что время ее работы <tex>O(h)</tex>, где <tex>h</tex> - высота дерева.
=== Поиск минимума и максимума ===
Чтобы найти минимальный элемент в бинарном дереве поиска, необходимо просто следовать указателям left от корня дерева, пока не встретится значение null. Если у вершины есть левое поддерево, то по свойству бинарного дерева поиска в нем хранятся все элементы с меньшим ключом. Если его нет, значит эта вершина и есть минимальная. Аналогично ищется и максимальный элемент. Для этого нужно следовать правым указателям.
x = x.left
'''return ''' x
x = x.right
'''return ''' x
Данные функции принимают корень дерева, и возвращают минимальный(максимальный) элемент в дереве. Обе процедуры выполняются за время <tex>O(h)</tex>.
=== Поиск следующего и предыдущего элемента ===
Если у узла есть правое поддерево, то следующий за ним элемент будет минимальным элементом в этом поддереве. Если у него нет правого поддерева, то нужно следовать вверх, пока не встретим узел, который является левым дочерним узлом своего родителя. Поиск предыдущего выполнятся аналогично. Если у узла есть левое поддерево, то следующий за ним элемент будет максимальным элементом в этом поддереве. Если у него нет левого поддерева, то нужно следовать вверх, пока не встретим узел, который является правым дочерним узлом своего родителя.
y = x.parent
'''while ''' y != null '''and ''' x == y.right
x = y
y = y.parent
'''return ''' y
y = x.parent
'''while ''' y != null '''and ''' x == y.left
x = y
y = y.parent
'''return ''' y
Обе операции выполняются за время <tex>O(h)</tex>.
=== Вставка ===
Операция вставки работает аналогично поиску элемента, только при обнаружении нулевого указателя у элемента отсутствия ребенка нужно подвесить на него вставляемый элемент. Приведем итеративную реализацию этого алгоритма. treeInsert'''insert'''(Node x, Node z) // корень дерева, вставляемый элемент
Node y = null
'''while ''' x != null
y = x
'''if ''' z.key > x.key
x = x.right
'''else'''
x = x.left
z.parent = y
'''if ''' z.key > y.key
y.right = z
'''else'''
y.left = z
Время работы алгоритма <tex>O(h)</tex>.
| [[Файл:Bst_del4.png]]
|}
== Литература ==