Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Labs-Programming.doc
Скачиваний:
23
Добавлен:
06.09.2019
Размер:
574.98 Кб
Скачать

Бинарные деревья поиска

Бинарным деревом поиска [5, гл. 12] называется бинарное дерево [5, пр. B] со следующими свойствами:

  1. С каждым узлом ассоциировано значение, тип данных которого допускает применение операции <.

  2. Левый потомок каждого узла и все поддерево, корнем которого он является (левое поддерево), содержит меньшие значения, чем значение данного узла.

  3. Правый потомок каждого узла и все поддерево, корнем которого он является (правое поддерево), содержит большие значения, чем значение данного узла.

Примеры бинарного дерева поиска приведены на рис. 7.

Рис. 7. Примеры бинарного дерева поиска.

Бинарное дерево поиска может рассматриваться как контейнер. В нем можно определить операции добавления, удаления и поиска элементов. Как правило, операции добавления, удаления и поиска определяются следующим образом:

Поиск

Работа поиска иллюстрируется на рис. 8.

Рис. 8. Поиск в бинарном дереве поиска.

  1. При поиске элемента мы сравниваем значение, которое ищем, со значением корня. Если оно совпало – мы нашли элемент.

  2. Если значение, которое мы ищем, меньше – следует искать в левом поддереве.

  3. Если значение, которое мы ищем, больше – следует искать в правом поддереве.

  4. Далее продолжаем действовать по тому же алгоритму, пока не найдем элемент или пока поддерево, в котором следует искать, не окажется пустым (в этом случае мы можем сказать, что такого элемента в дереве нет).

Время поиска пропорционально высоте дерева.

Добавление элемента

  1. Добавление элемента реализуется аналогично поиску. Поскольку такого элемента еще нет (считаем, что в бинарном дереве поиска не может быть двух элементов с одинаковыми значениями), то в итоге поиска мы найдем пустое поддерево, где этот элемент должен быть.

  2. На месте этого пустого поддерева размещаем элемент.

Рис. 9. Добавление элемента в бинарное дерево поиска.

Время добавления пропорционально высоте дерева.

Удаление элемента

  1. Если удаляемый элемент не имеет потомков, мы можем просто удалить его. См. рис. 10.

Рис. 10. Удаление элемента из бинарного дерева поиска.

  1. Если удаляемый элемент имеет одного потомка – поднимаем этого потомка на имя удаляемого элемента. См. рис. 11.

Рис. 11. Удаление элемента из бинарного дерева поиска.

  1. Если удаляемый элемент имеет двух потомков, нам нужно найти в правом поддереве минимальный элемент. Найти в поддереве минимальный элемент просто.

    1. Если корень не имеет левого потомка – он и есть минимальный.

    2. Иначе минимальный элемент следует искать в левом поддереве. Вернемся к пункту a, но высота нашего дерева стала на единицу меньше.

    3. Таким образом, мы найдем минимальный элемент в поддереве за время, пропорциональное высоте поддерева.

    4. На рис. 12-14 минимальные элементы поддерева выделены голубым цветом.

Найдя минимальный элемент правого поддерева, мы ставим его на место удаляемого элемента. Левого потомка у этого элемента по определению нет (если бы был, был бы еще меньше, и данный элемент не был бы минимальным элементом поддерева). Если нет и правого потомка – элемент можно просто удалить. Если правый потомок есть – ставим этого правого потомка на его место.

Рис. 12. Удаление элемента из бинарного дерева поиска.

Рис. 13. Удаление элемента из бинарного дерева поиска.

Рис. 14. Удаление элемента из бинарного дерева поиска.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]