Наивное дерево поиска
Содержание
Определение и свойства
Двоичное дерево поиска (англ. - Binary Search tree - BST) - структура данных двоичное дерево, для любого узла которого выполняются следующие свойства:
- Оба узла поддерева являются двоичными деревьями поиска;
- Все значения ключей левого поддерева меньше ключа узла;
- Все значения ключей правого поддерева больше ключа узла.
Операции над деревом
Поиск
Алгоритм
Поиск узла по заданному ключу можно осуществлять рекурсивно, начиная из вершины.
- Если узел отсутствует, возвращаем нулевой указатель.
- Если значение в узле равно ключу, возвращаем указатель на узел.
- Если значение в узле больше ключа, запускаем поиск по ключу в левом поддереве.
- Если значение в узле меньше ключа, запускаем поиск по ключу в правом поддереве.
Реализация на языке C
node_t* find (node_t* head, elem_t key) {
if (!head)
return NULL;
if (head->data == key)
return head;
if (head->data > key)
return find(head->left, key);
if (head->data < key)
return find(head->right, key);
}
Вставка
Алгоритм
Вставку ключа, как и поиск, будем осуществлять рекурсивно, начиная из вершины.
- Если узел пустой, вставляем на его место новый узел с ключом.
- Если ключ равен значению в узле, возвращаемся и ничего не добавляем.
- Если ключ меньше значения в узле, рекурсивно вызываем вставку в левом поддереве.
- Если ключ больше значения в узле, рекурсивно вызываем вставку в правом поддереве.
Реализация на языке C
void insert (node_t* head, T key) {
if (head->data == key)
return;
if (head->data > key) {
if (head->left == null) {
node_t* newnode = node_create(key);
newnode->parent = head;
head->left = newnode;
return;
}
insert(head->left, key);
}
if (head->data < key) {
if (head->right == null) {
node_t* newnode = node_create(key);
newnode->parent = head;
head->right = newnode;
return;
}
insert(head->right, key);
}
}
Удаление
Алгоритм
Удаление вершины по ключу будем также осуществлять рекурсивно, начиная из вершины.
- Если вершина пуста, возвращаемся.
- Если вершина пуста