Двоичное дерево: различия между версиями
[непроверенная версия] | [непроверенная версия] |
м косметика |
удалена реклама |
||
(не показано 48 промежуточных версий 36 участников) | |||
Строка 1: | Строка 1: | ||
'''Двои́чное де́рево''' (Бинарное дерево) — иерархическая [[структура данных]], в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым наследниками. Двоичное дерево является упорядоченным [[Дерево (теория графов)|ориентированным деревом]]. |
|||
[[Image:Binary search tree.svg|right|200px|thumb| Пример двоичного дерева]] |
|||
'''Двои́чное де́рево''' — [[структура данных]], являющаяся одной из программных реализаций [[Дерево (теория графов)#Двоичное дерево|двоичного дерева теории графов]] и построена по следующим правилам: |
|||
: 1. Двоичное дерево состоит из узлов (вершин) — записей вида (parent, data, left, right), где parent - ссылка на родительский элемент, data — некоторые данные привязанные к узлу, left и right — ссылки на узлы, являющиеся детьми данного узла - левый и правый сыновья соответственно. Поле parent для корневого элемента является пустым или неопределённым в зависимости от реализации. |
|||
: 2. Для любой вершины x выполняется условие: data[left[x]] ≤ data[x] ≤ data[right[x]], т. е. данные родительского узла больше или равны данным левого сына и меньше или равны значению правого. |
|||
Для практических целей обычно используют два подвида двоичных деревьев — [[двоичное дерево поиска]] и [[двоичная куча]]. |
|||
Не следует путать двоичное дерево с [[Сортирующее дерево|кучей]]. |
|||
== Рекурсивное определение == |
== Рекурсивное определение == |
||
Существует следующее рекурсивное определение двоичного дерева (см. [[Форма Бэкуса — Наура|БНФ]]): |
Существует следующее рекурсивное определение двоичного дерева (см. [[Форма Бэкуса — Наура|БНФ]]): |
||
<дерево> ::= ( <данные> <дерево> <дерево> ) | |
<двоичное дерево> ::= ( <данные> <двоичное дерево> <двоичное дерево> ) | null . |
||
То есть двоичное дерево либо является пустым, либо состоит из данных и двух поддеревьев (каждое из которых может быть пустым). Очевидным, но важным для понимания фактом является то, что каждое поддерево в свою очередь тоже является деревом. |
То есть двоичное дерево либо является пустым, либо состоит из данных и двух поддеревьев (каждое из которых может быть пустым). Очевидным, но важным для понимания фактом является то, что каждое поддерево в свою очередь тоже является деревом. |
||
Если у некоторого узла оба поддерева пустые, то он называется листовым узлом (листовой вершиной). |
Если у некоторого узла оба поддерева пустые, то он называется листовым узлом (листовой вершиной) или конечным (терминальным) узлом<ref>{{Cite web|url=https://prog-cpp.ru/data-tree/|title=Дерево|accessdate=2019-03-01|archive-date=2019-03-02|archive-url=https://web.archive.org/web/20190302090632/https://prog-cpp.ru/data-tree/|deadlink=no}}</ref>. |
||
Например, показанное справа на рис. 1 дерево |
Например, показанное справа на рис. 1 дерево согласно этой грамматике можно было бы записать так: |
||
{| |
{| |
||
Строка 22: | Строка 19: | ||
(e |
(e |
||
(c |
(c |
||
(a |
(a null null) |
||
null |
|||
) |
) |
||
(g |
(g |
||
null |
|||
(k |
(k null null) |
||
) |
) |
||
) |
) |
||
(s |
(s |
||
(p (o |
(p (o null null) (s null null) ) |
||
(y |
(y null null) |
||
) |
) |
||
) |
) |
||
Строка 40: | Строка 37: | ||
|} |
|} |
||
Каждый узел в дереве задаёт ''поддерево'', корнем которого он является. У вершины <tt> |
Каждый узел в дереве задаёт ''поддерево'', корнем которого он является. У вершины <tt>m = (data, left, right)</tt> есть два потомка (левый и правый) <tt>left</tt> и <tt>right</tt> и, соответственно, два поддерева (левое и правое) с корнями <tt>left</tt> и <tt>right</tt><ref>{{Cite web|url=http://algolist.manual.ru/ds/btree.php|title=Двоичные деревья поиска: начальные сведения|publisher=algolist.manual.ru|accessdate=2019-03-01|archive-date=2019-07-14|archive-url=https://web.archive.org/web/20190714145450/http://algolist.manual.ru/ds/btree.php|deadlink=no}}</ref>. |
||
== Применение == |
== Применение == |
||
Многие полезные структуры данных основаны на двоичном дереве: |
Многие полезные структуры данных основаны на двоичном дереве: |
||
* [[Двоичное дерево поиска]] |
* [[Двоичное дерево поиска]] |
||
* [[Двоичная куча]] |
|||
* [[АВЛ-дерево]] |
* [[АВЛ-дерево]] |
||
* [[Красно-чёрное дерево]] |
* [[Красно-чёрное дерево]] |
||
⚫ | |||
* [[Дерево Фибоначчи]] |
* [[Дерево Фибоначчи]] |
||
* [[Суффиксное дерево]] |
* [[Суффиксное дерево]] |
||
== Примечания == |
|||
Двоичное дерево применяется в [[Сортировка с помощью двоичного дерева|соответствующем алгоритме сортировки]]. |
|||
{{примечания}} |
|||
== Ссылки == |
|||
⚫ | |||
{{Навигация}} |
|||
[[Категория:Теория графов]] |
|||
{{Деревья (структуры данных)}} |
|||
{{Link FA|pt}} |
|||
⚫ | |||
[[bg:Двоично дърво]] |
|||
[[cs:Binární strom]] |
|||
[[de:Binärbaum]] |
|||
[[en:Binary tree]] |
|||
[[eo:Duuma arbo]] |
|||
[[es:Árbol binario]] |
|||
[[fi:Binääripuu]] |
|||
[[fr:Arbre binaire]] |
|||
[[he:עץ בינארי]] |
|||
[[id:Pohon biner]] |
|||
[[is:Tvíundartré]] |
|||
[[it:Albero binario]] |
|||
[[ja:二分木]] |
|||
[[ko:이진 트리]] |
|||
[[pl:Drzewo binarne]] |
|||
[[pt:Árvore binária]] |
|||
[[ro:Arbore binar]] |
|||
[[sk:Binárny strom (teória grafov)]] |
|||
[[sl:Dvojiško drevo]] |
|||
[[sr:Бинарно стабло]] |
|||
[[sv:Binärträd]] |
|||
⚫ | |||
[[zh:二叉树]] |
Текущая версия от 20:30, 26 февраля 2024
Двои́чное де́рево (Бинарное дерево) — иерархическая структура данных, в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым наследниками. Двоичное дерево является упорядоченным ориентированным деревом.
Для практических целей обычно используют два подвида двоичных деревьев — двоичное дерево поиска и двоичная куча.
Рекурсивное определение
[править | править код]Существует следующее рекурсивное определение двоичного дерева (см. БНФ):
<двоичное дерево> ::= ( <данные> <двоичное дерево> <двоичное дерево> ) | null .
То есть двоичное дерево либо является пустым, либо состоит из данных и двух поддеревьев (каждое из которых может быть пустым). Очевидным, но важным для понимания фактом является то, что каждое поддерево в свою очередь тоже является деревом. Если у некоторого узла оба поддерева пустые, то он называется листовым узлом (листовой вершиной) или конечным (терминальным) узлом[1].
Например, показанное справа на рис. 1 дерево согласно этой грамматике можно было бы записать так:
(m (e (c (a null null) null ) (g null (k null null) ) ) (s (p (o null null) (s null null) ) (y null null) ) ) |
Каждый узел в дереве задаёт поддерево, корнем которого он является. У вершины m = (data, left, right) есть два потомка (левый и правый) left и right и, соответственно, два поддерева (левое и правое) с корнями left и right[2].
Применение
[править | править код]Многие полезные структуры данных основаны на двоичном дереве:
- Двоичное дерево поиска
- Двоичная куча
- АВЛ-дерево
- Красно-чёрное дерево
- Матричное дерево
- Дерево Фибоначчи
- Суффиксное дерево
Примечания
[править | править код]- ↑ Дерево . Дата обращения: 1 марта 2019. Архивировано 2 марта 2019 года.
- ↑ Двоичные деревья поиска: начальные сведения . algolist.manual.ru. Дата обращения: 1 марта 2019. Архивировано 14 июля 2019 года.