Ответ
Бинарное дерево поиска (BST) — это структура данных, где для каждого узла выполняется строгое правило: все значения в левом поддереве меньше значения узла, а все значения в правом — больше.
Алгоритм поиска:
- Начать с корневого узла.
- Сравнить искомое значение с ключом текущего узла.
- Если значения совпадают — узел найден.
- Если искомое значение меньше — перейти к левому дочернему узлу и повторить шаг 2.
- Если искомое значение больше — перейти к правому дочернему узлу и повторить шаг 2.
- Если дочерний узел, к которому нужно перейти, отсутствует (
nil
), значит, искомого значения в дереве нет.
Реализация на Go (рекурсивный и итеративный подходы):
package main
type Node struct {
Value int
Left *Node
Right *Node
}
// Рекурсивный поиск
func SearchRecursive(node *Node, target int) *Node {
if node == nil || node.Value == target {
return node
}
if target < node.Value {
return SearchRecursive(node.Left, target)
}
return SearchRecursive(node.Right, target)
}
// Итеративный поиск (более эффективен по памяти)
func SearchIterative(root *Node, target int) *Node {
current := root
for current != nil {
if target == current.Value {
return current
}
if target < current.Value {
current = current.Left
} else {
current = current.Right
}
}
return nil
}
Сложность алгоритма:
- В среднем/лучшем случае:
O(log n)
— для сбалансированного дерева, так как на каждом шаге мы отсекаем половину оставшихся узлов. - В худшем случае:
O(n)
— для несбалансированного (вырожденного) дерева, которое превращается в связный список.