Struchkov Mark
eacf800157
All checks were successful
continuous-integration/drone/push Build is passing
55 lines
4.6 KiB
Markdown
55 lines
4.6 KiB
Markdown
---
|
||
aliases:
|
||
- бинарное дерево
|
||
- бинарному дереву
|
||
tags:
|
||
- maturity/🌱
|
||
date: 2024-01-29
|
||
---
|
||
Бинарное дерево поиска — это [[структура данных]], в которой выполняются три свойства:
|
||
- Элементы в левом поддереве должны быть меньше родительского узла.
|
||
- Элементы в правом поддереве должны быть больше родительского узла.
|
||
- У каждого узла не больше двух потомков.
|
||
|
||
![x|400](../../../meta/files/images/Pasted%20image%2020240129190639.png)
|
||
|
||
**Эти свойства обеспечивают:**
|
||
- Гарантированный порядок элементов.
|
||
- Детерминированный алгоритм поиска.
|
||
- В вырожденном случае придется посетить все элементы — сложность O(n).
|
||
|
||
|
||
> [!TIP] Сбалансированное дерево
|
||
> Чтобы улучшить поиск, можно использовать [сбалансированное](Сбалансированное%20дерево.md) бинарное дерево.
|
||
|
||
**Сложность операций**
|
||
- **Средний случай**: поиск, вставка и удаление выполняются за O(log n), если дерево сбалансировано.
|
||
- **Худший случай**: если дерево становится несбалансированным, операции могут иметь сложность O(n). Это происходит, когда элементы добавляются в возрастающем или убывающем порядке, превращая дерево в цепочку.
|
||
## Основные операции с бинарным деревом поиска
|
||
### Вставка
|
||
При вставке нового элемента в бинарное дерево поиска он помещается в соответствующее место таким образом, чтобы сохранялся порядок элементов. Например, если вставляется значение `15`, и оно меньше текущего узла, оно вставляется в левое поддерево, иначе — в правое.
|
||
|
||
### Удаление
|
||
Удаление элемента из бинарного дерева поиска может потребовать нескольких шагов, чтобы сохранить его свойства:
|
||
- **Удаление листа**: просто удаляется узел.
|
||
- **Удаление узла с одним потомком**: узел заменяется своим потомком.
|
||
- **Удаление узла с двумя потомками**: узел заменяется минимальным значением в правом поддереве или максимальным значением в левом поддереве.
|
||
### Поиск
|
||
Поиск элемента в бинарном дереве поиска выполняется путем рекурсивного или итеративного перехода по узлам, начиная с корня. Если искомое значение меньше текущего узла, поиск продолжается в левом поддереве, если больше — в правом.
|
||
|
||
### Обход дерева
|
||
- **In-order обход**: обходит узлы в порядке возрастания значений. Используется для получения отсортированного списка элементов дерева.
|
||
- **Pre-order обход**: сначала посещается корень, затем левое и правое поддеревья. Полезно для копирования дерева.
|
||
- **Post-order обход**: сначала посещаются оба поддерева, затем корень. Используется для удаления дерева.
|
||
***
|
||
## Мета информация
|
||
**Область**:: [[../../../meta/zero/00 Разработка|00 Разработка]]
|
||
**Родитель**:: [[Tree]]
|
||
**Источник**::
|
||
**Автор**::
|
||
**Создана**:: [[2024-01-29]]
|
||
### Дополнительные материалы
|
||
-
|
||
### Дочерние заметки
|
||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|