Введение
Бинарное дерево — это структура данных, в которой каждый элемент (узел) может иметь не более двух дочерних элементов.
В этой статье я расскажу вам, как мы можем реализовать двоичное дерево в javascript. Итак, давайте кодировать
Код
class Node { constructor(data) { this.data = data; } } class BinaryTree { constructor() { this.root = new Node(2); this.root.left = new Node(7); this.root.right = new Node(5); } }
Программа проста: двоичное дерево содержит корневой элемент, который является узлом, и содержит еще два узла, которые находятся в левой и правой позициях. Как и корневой элемент, каждый узел содержит еще два узла в левой и правой позициях. У узла есть три части - данные, левая и правая.
Одним из типов бинарного дерева является бинарное дерево поиска, которое содержит данные в отсортированном порядке. Подробнее о бинарном дереве поиска читайте в этой статье.
Обход
Теперь давайте посмотрим, как обойти дерево. Есть три типа обхода -
- Неупорядоченный обход - сначала посетите левый узел, затем корень и последний правый узел.
- Обход в предварительном порядке - сначала посетите корневой узел, затем левый и последний правый узел.
- Обход в обратном порядке - сначала посетите левый узел, затем правый и последний корневой узел.
Давайте напишем программу для обхода данных:
class Node { constructor(data) { this.data = data; this.left = null; this.right = null; } } class BinaryTree { constructor() { this.root = new Node(2); this.root.left = new Node(10); this.root.right = new Node(5); } inOrderTraverse() { const traverse = (node) => { if (node != null) { traverse(node.left); console.log(node.data); traverse(node.right); } } traverse(this.root); } preOrderTraverse() { const traverse = (node) => { if (node != null) { console.log(node.data); traverse(node.left); traverse(node.right); } } traverse(this.root); } postOrderTraverse() { const traverse = (node) => { if (node != null) { traverse(node.left); traverse(node.right); console.log(node.data); } } traverse(this.root); } } const tree = new BinaryTree(); tree.inOrderTraverse(); tree.preOrderTraverse(); tree.postOrderTraverse();
Searching
Поиск в бинарном дереве можно выполнить двумя способами:
- BFS - поиск элемента по ширине, т.е. сначала проверьте левый элемент, а затем правый элемент
- DFS - поиск по глубине, т.е. сначала проверьте всю левую сторону, а затем правую сторону или сначала правую сторону, а затем левую сторону.
Давайте посмотрим каждый из них -
БФС
Алгоритм BFS проверяет элементы по строкам, то есть сначала проверяет все левые и правые элементы строки, прежде чем перейти к следующей строке.
Давайте посмотрим программу, чтобы было понятнее -
class Node { constructor(data) { this.data = data; this.left = null; this.right = null; } } class BinaryTree { constructor() { this.root = new Node(2); const leftNode = new Node(10); leftNode.left = new Node(22); leftNode.right = new Node(123); this.root.left = leftNode; this.root.right = new Node(5); } bfs(searchValue) { const search = (tree) => { var queue = [] queue.push(tree); while (queue.length !== 0) { for (let i = 0; i < queue.length; i++) { var node = queue.shift() if (node.data === searchValue) { return node } // search breadth wise, so push left & right node if (node.left) { queue.push(node.left) } if (node.right) { queue.push(node.right) } } } return null } return search(this.root); } } const tree = new BinaryTree(); tree.bfs(22);
ДФС
class Node { constructor(data) { this.data = data; this.left = null; this.right = null; } } class BinaryTree { constructor() { this.root = new Node(2); const leftNode = new Node(10); leftNode.left = new Node(22); leftNode.right = new Node(123); this.root.left = leftNode; this.root.right = new Node(5); } dfs(searchValue) { var stack = [] stack.push(this.root); while (stack.length !== 0) { for (let i = 0; i < stack.length; i++) { var node = stack.pop() if (node.data === searchValue) { return node } // search breadth wise, so push left & right node if (node.left) { stack.push(node.left) } if (node.right) { stack.push(node.right) } } } return null } } const tree = new BinaryTree(); tree.dfs(22);
Как вы можете видеть, единственная разница между bsf и dfs заключается в том, что bfs использует очередь, а dfs использует стек, и, конечно, из-за этого они ищут элемент по-разному.
Спасибо, что прочитали это, ребята. Надеюсь, вы найдете ее полезной.