Я считаю, что в реальной жизни каждый знаком с деревьями. Будь то ивы, тополя или персиковые деревья, можно сказать, что в компьютерном мире деревья можно увидеть повсюду, деревья — это абстракция ; иерархической структуры ,
как показано ниже:
Существует множество применений древовидной структуры. Например, организационную структуру компании можно представить в виде дерева, как показано ниже:
Помимо организационных структур, такие вещи, как генеалогические деревья, провинции, города и т. д., могут быть представлены с использованием древовидных структур.
Существует множество терминов для обозначения деревьев, как показано ниже:
n=0
, оно называется пустым деревом;ADH
;является одной из наиболее распространенных структур данных во внешнем интерфейсе, например дерево DOM, каскадный выбор, компоненты дерева и т. д.
JavaScript не предоставляет древовидную структуру данных, но мы можем ее использовать; объекты и массив для имитации дерева,
например следующий код:
const Tree = { значение: 'А', дети: [ { значение: 'Б', дети: [ {значение: 'E', дети: ноль}, {значение: 'F', дети: ноль}, ], }, { значение: 'С', дети: [{ значение: 'G', дети: ноль }], }, { значение: 'D', дети: [ {значение: 'H', дети: ноль}, {значение: 'Я', дети: ноль}, ], }, ], }
Так называемый алгоритм обхода в глубину предназначен для максимально глубокого поиска ветвей дерева. Его порядок обхода следующий:
Идея реализации следующая:
children
корневого узла,код реализации следующий:
function dfs(root) {; console.log(root.value) root.children && root.children.forEach(dfs) // Соответствует следующему // if (root.children) { // root.children.forEach(child => { //dfs(дочерний) // }) // } } dfs(tree) //Это дерево является деревом, определенным ранее/* Результат A Б Э Ф С Г Д ЧАС я */
Как видите, порядок соответствует картинке, а значит проблем с нашим алгоритмом нет.
Так называемый приоритет ширины заключается в посещении узлов, ближайших к корневому узлу, по порядку. Порядок его обхода следующий:
Идея реализации следующая:
children
головы очереди последовательноКод реализации следующий:
function bfs(root) { // 1. Создать новую очередь и добавить в нее узлы const q = [root] // 4 Повторяем while (q.length > 0) { const node = q.shift() // 2-й заголовок очереди выводится из очереди console.log(node.value) // В команду добавляются 3 ребенка, глава команды node.children && node.children.forEach(child => { q.push(ребенок) }) } } bfs(дерево) /* Результат А Б С Д Э Ф Г ЧАС я */
Как видите, порядок соответствует картинке, а значит проблем с нашим алгоритмом нет.