Тема 3.7 Деревья
Определение: Деревом называется связный, ориентированный граф без петель и кратных ребер, не содержащий в себе циклов, удовлетворяющий следующим условиям:
- имеется в точности один узел, называемый корнем, в который не входит ни одно ребро,
- В каждый узел, кроме корня, входит ровно одно ребро,
- Из корня к каждому узлу идет путь ( который, как легко показать единственный).
Деревья являются простейшим видом связных графов. Любое дерево с n вершинами содержит n-1 ребер. Число различных деревьев, которые можно построить на n вершинах равно
- Каждый сын произвольного узла идентифицируется либо как левый сын, либо как правый сын.
- Каждый узел имеет не более одного левого и не более одного правого сына.
Обратите внимание, что бинарное дерево не является частным случаем дерева, это совершенно иное, хотя и тесно связанное понятие. Н
Прохождение дерева т в прямом порядке определяется следующим алгоритмом:
- Посетить корень r
- Посетить слева на право поддеревья с корнями v1 . . . vk в указанной последовательности.
П
- Числовые характеристики графа
1.5. Понятие обхода графа 1.5.1. Эйлеров цикл 1.5.2. Гамильтонов цикл
- Изоморфизм графов
- Понятие дерева
- Бинарные деревья
- Алгоритмы нумерации узлов графа
- Нумерация в прямом порядке
- Нумерация в обратном порядке
- Нумерация во внутреннем порядке
Подобная система нумерации часто называется десятичной системой обозначения Дьюи. В
- СЧЕТ СЧЕТ+1
4. if ПРАВЫЙСЫН[УЗЕЛ]0 then ВНУТРПОРЯДОК(ПРАВЫЙСЫН[УЗЕЛ]); End Такая процедура, которая явно или неявно вызывает сама себя, называется рекурсивной. Применение рекурсии часто дает возможность давать более прозрачное и сжатое описание алгоритма, чем это же можно было бы сделать, не используя рекурсию. Если бы приведенный алгоритм не был записан рекурсивно, надо было бы строить явный механизм для прохождения дерева. Двигаться вниз по дереву нетрудно, но чтобы обеспечить возможность вернуться к предку, надо запомнить всех предков в стеке, а операторы работы со стеком усложнили бы алгоритм, лишив его наглядности.
Источник
Высота и глубина бинарного дерева
Эта статья направлена на то, чтобы провести различие между двумя свойствами бинарных деревьев, называемыми высотой и глубиной. В соответствии с терминологией бинарного дерева ниже приведены определения высоты и глубины бинарного дерева.
Высота. Высота бинарного дерева — это количество ребер на самом длинном пути от корневого узла до самого дальнего конечного узла.
Глубина. Глубина бинарного дерева — это количество узлов на самом длинном пути от корневого узла до самого дальнего конечного узла.
Несколько терминов бинарного дерева
Пустое дерево имеет высоту -1
Дерево только с одним узлом (корневым узлом) имеет высоту 0.
Давайте рассмотрим несколько примеров бинарного дерева, чтобы прояснить разницу.
Давайте посчитаем высоту Дерева 1, Дерева 2, Дерева 3 и Дерева 4
Дерево 1: мы отслеживаем узлы 50–70–60–55, что дает 3 ребра между узлами, следовательно, высота равна 3
Дерево 2: мы отслеживаем узлы 15–20–25, что дает 2 ребра между узлами, следовательно, высота равна 2
Дерево 3: мы отслеживаем узлы 14–15–18–21–25–45, что дает 5 ребер между узлами, следовательно, высота равна 5
Дерево 4: мы отслеживаем узлы 12–14–18–16, что дает 3 ребра между узлами, следовательно, высота равна 3
Давайте посчитаем глубину дерева 1, дерева 2, дерева 3 и дерева 4
Дерево 1: мы считаем узлы 50–70–60–55, что дает 4 узла, следовательно, глубина равна 4.
Дерево 2: мы отслеживаем узлы 15–20–25, что дает 3 узла, следовательно, глубина равна 3
Дерево 3: мы отслеживаем узлы 14–15–18–21–25–45, что дает 6 узлов, следовательно, глубина равна 6
Дерево 4: мы отслеживаем узлы 12–14–18–16, что дает 4 узла, следовательно, глубина равна 4
Давайте посмотрим на приведенный ниже фрагмент кода для определения высоты и глубины двоичного дерева.
Предположим, мы построили деревья от 1 до 4.
public class HeightDepthBST < Node root; int height (Node node) < if (node == null) return 0; else if (node.left == null && node.right == null) return 0; return 1 + Math.max (height(node.left), height(node.right)); > int depth (Node node) < if (node == null) return 0; int left = depth (node.left); int right = depth (node.right); return (left > right) ? left+1 : right+1; > public static void main(String[] args) < HeightDepthBST a = new HeightDepthBST(); a.root = a.createBST(); System.out.println("Height "+height(a.root)); System.out.println("Depth "+depth(a.root)); > Node createBST() < // Tree 4 in above root = null; root = add (root, 12); root = add (root, 6); root = add (root, 5); root = add (root, 8); root = add (root, 7); root = add (root, 9); root = add (root, 14); root = add (root, 18); root = add (root, 16); return root; > Node add (Node node, int data) < if (null == node) return new Node (data); else if (data < node.data) node.left = add (node.left, data); else if (data > node.data) node.right = add (node.right, data); return node; > > class Node < int data; Node left, right; Node (int data) < this.data=data; > > Временная сложность кода height() и depth() составляет O(N).
Вывод
В этой статье мы проследили 2 важных свойства бинарного дерева, а именно высоту и глубину. Мы посетили код, чтобы вычислить их. Мы также увидели, в чем разница между ними с точки зрения дерева.
Источник
Деревья
Дерево — это нелинейная иерархическая структура данных. Она состоит из узлов и ребер, которые соединяют узлы.
Зачем нужны деревья
Другие структуры данных, например, массивы, списки, стеки и очереди, линейные. Это значит, что данные в них хранятся последовательно. Когда мы выполняем любую операцию в линейной структуре данных, временная сложность растет с увеличением размера данных. В современном мире это не очень круто.
Разные древовидные структуры позволяют быстрее и легче получать доступ к данным, поскольку дерево — структура нелинейная.
Части дерева
- Узел — это объект, в котором есть ключ или значение и указатели на дочерние узлы.
Узлы, у которых нет дочерних узлов, называют листами или терминальными узлами.
Узлы, у которых есть хотя бы один дочерний узел, называются внутренними. - Ребро связывает два узла.
- Корень — это самый верхний узел дерева. Его ещё иногда называют корневым узлом.
Другие понятия
- Высота узла — это максимальная длина пути от этого узла к самому нижнему узлу (листу).
- Глубина вложенности узла — длина пути от корня до этого узла.
- Высота дерева — это высота корневого узла или глубина самого глубокого узла.
- Степень узла — это общее количество ребер, которые соединены с этим узлом.
- Лес — множество непересекающихся деревьев. Например, если «срезать» корень, получится лес.
Виды деревьев
Обход дерева
Чтобы выполнить какую-либо операцию с деревом, нужно добраться до определенного узла. Для этого и существуют алгоритмы обхода дерева. Они помогают «дойти» до необходимого узла.
Где используются
- Деревья двоичного поиска помогают быстро проверить наличие элемента в наборе.
- Куча — это тоже своеобразное дерево. Кучи используют в алгоритме сортировки кучей.
- Префиксные деревья используются в маршрутизаторах, они хранят информацию о маршруте.
- Большинство популярных баз данных основаны на B-деревья и T-деревья.
- Компиляторы используют абстрактное синтаксическое дерево, чтобы находить синтаксические ошибки в ваших программах.
СodeСhick.io — простой и эффективный способ изучения программирования.
2023 © ООО «Алгоритмы и практика»
Источник