Вступление
Дерево в программном обеспечении похоже на биологическое дерево, но со следующими отличиями:
- Рисуется в перевернутом виде.
- У него только один корень и нет стебля.
- Ветви выходят из корня.
- Точка, в которой ветвь отходит от другой ветки или корня, называется узлом.
- Каждый узел имеет значение.
Ветви дерева программного обеспечения представлены прямыми линиями. Хорошим примером дерева программ, которое вы, возможно, использовали, является дерево каталогов жесткого диска вашего компьютера.
Есть разные виды деревьев. Есть общее дерево, из которого происходят другие деревья. Остальные деревья получаются путем введения ограничений в общее дерево. Например, вам может понадобиться дерево, в котором от узла исходят не более двух ветвей; такое дерево будет называться двоичным деревом. В этой статье описывается общее дерево и как получить доступ ко всем его узлам.
Гиперссылка для загрузки кода приведена внизу статьи.
Чтобы понять примеры кода в этой статье, вам необходимо иметь базовые знания в JavaScript (ECMAScript). Если у вас нет этих знаний, вы можете получить их по адресу http: // www.широкая сеть.ru / ChrysanthusForcha-1 / ECMAScript-2015-Course.htm
Общая древовидная диаграмма
«А» - корневой узел; это узел первого уровня. B, C, D находятся на второй строке; это узлы второго уровня. E, F, G, H, I, J, K находятся на третьей линии, и они являются узлами третьего уровня. Четвертая строка создала бы узлы четвертого уровня и т. Д.
Свойства дерева
- Все ветви для всех уровней узлов имеют один источник, который является корневым узлом.
- Дерево имеет N - 1 ветвь, где N - общее количество узлов. На приведенной выше диаграмме общего дерева 11 узлов и 10 ветвей.
- В отличие от людей, где у каждого ребенка два родителя, в дереве программного обеспечения у каждого ребенка есть только один родитель. Корневой узел - самый большой родительский предок. Родитель может иметь более одного ребенка. Каждый узел, кроме корневого, является дочерним.
Словарь по дереву
- Корневой узел: Это самый высокий узел в дереве, и у него нет родителя. У каждого другого узла есть родитель.
- Листовые узлы: Листовой узел - это узел, у которого нет дочернего элемента. Обычно они находятся внизу дерева, а иногда - слева и / или справа от дерева.
- Ключ: Это ценность дерева. Это может быть число; это может быть строка; это может быть даже оператор, такой как +, - или x.
- Уровни: Корневой узел находится на первом уровне. Его дети находятся на втором уровне; Потомки узлов второго уровня находятся на третьем уровне и т. Д.
- Родительский узел: Каждый узел, кроме корневого, имеет родительский узел, связанный с ним ветвью. Любой узел, кроме корневого, является дочерним узлом.
- Родственные узлы: Родственные узлы - это узлы, которые имеют одного и того же родителя.
- Дорожка: Ветви (прямые линии), соединяющие один узел с другим через другие узлы, образуют путь. Ветви могут быть стрелками, а могут и не быть.
- Узел-предок: Все более высокие узлы, подключенные к дочернему, включая родительский и корневой узел, являются узлами-предками.
- Дочерний узел: Все нижние узлы, подключенные к узлу, вплоть до связанных листьев, являются узлами-потомками. Рассматриваемый узел не является частью узлов-потомков. Рассматриваемый узел не обязательно должен быть корневым.
- Поддерево: Узел плюс все его потомки вплоть до связанных листьев образуют поддерево. Начальный узел включен, и он не обязательно должен быть корневым; в противном случае это было бы все дерево.
- Степень: Количество дочерних узлов у узла называется степенью узла.
Обход всех узлов дерева
Все узлы дерева могут быть доступны для чтения или изменения любого значения узла. Однако это не происходит произвольно. Это можно сделать тремя способами, каждый из которых включает обход в глубину следующим образом:
1) В порядке: Проще говоря, в этой схеме сначала проходит левое поддерево; затем осуществляется доступ к корневому узлу; затем проходит правое поддерево. Эта схема обозначается как левый-> корень-> правый. Рис. 1 повторно отображается здесь для удобства использования:
Предполагая, что на каждый узел приходится два брата и сестры; затем left-> root-> right означает, что вы сначала получаете доступ к самому нижнему и самому левому узлам, затем к родительскому узлу, а затем к правому брату. Если братьев и сестер больше двух, первый должен быть левым, а остальные правые - правым. Для общего дерева, приведенного выше, доступ к нижнему левому поддереву имеет значение [EBF]. Это поддерево. Родителем этого поддерева является A; Итак, следующий доступ к A, чтобы получить [EBF] A. Затем осуществляется доступ к поддереву [GCHI], чтобы иметь поддерево большего размера, [[EBF] A [GCHI]]. Вы можете увидеть, что левый-> корневой-> правый профиль изображает самого себя. Это большое левое поддерево будет иметь поддерево [JDK] справа, чтобы завершить обход, чтобы получить, [[EBF] A [GCHI]] [JDK].
2) Предварительный заказ: Проще говоря, в этой схеме сначала осуществляется доступ к корневому узлу, затем выполняется обход левого поддерева, а затем обход правого поддерева. Эта схема обозначается как корень-> влево-> вправо. Рис. 1 повторно отображается здесь для удобства использования.
Предполагая, что на каждый узел приходится два брата и сестры; затем root-> left-> right означает, что вы сначала получаете доступ к корню, затем к левому непосредственному дочернему элементу, а затем к правому непосредственному дочернему элементу. Если братьев и сестер больше двух, первый должен быть левым, а остальные правые - правым. Крайний левый дочерний элемент левого дочернего элемента - следующий, к которому нужно получить доступ. Для общего дерева выше корневым поддеревом является [ABCD]. Слева от этого поддерева находится поддерево [EF], задающее последовательность доступа [ABCD] [EF]. Справа от этого большего поддерева у вас есть два поддерева, [GHI] и [JK], дающие полную последовательность, [ABCD] [EF] [GHI] [JK]. Вы можете видеть, что корневой-> левый-> правый профиль изображает себя.
3) Пост-заказ: Проще говоря, в этой схеме сначала выполняется обход левого поддерева, затем обход правого поддерева, а затем доступ к корню. Эта схема обозначается как левый-> правый-> корень. Рис. 1 повторно отображается здесь для удобства использования.
Для этого дерева поддеревья: [EFB], [GHIC], [JKD] и [A], которые образуют последовательность, [EFB], [GHIC], [JKD] [A]. Вы можете увидеть левый-> правый-> корневой профиль, изображающий себя.
Создание дерева
Приведенное выше дерево будет создано с использованием ECMAScript, который похож на последнюю версию JavaScript. Каждый узел представляет собой массив. Первый элемент каждого массива узлов является родителем узла, еще один массив. Остальные элементы узла являются дочерними элементами узла, начиная с самого левого дочернего элемента. Существует карта ECMAScript, которая связывает каждый массив с соответствующей строкой (буквой). Первый сегмент кода: