Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Граф: определение дерева
Дерево — это один из фундаментальных типов графов в информатике и математике. Понимание структуры дерева критически важно для разработки алгоритмов, работы с базами данных и проектирования архитектур.
Определение дерева
Дерево — это связный неориентированный граф, который не содержит циклов.
По другому: граф называется деревом, если он удовлетворяет следующим условиям:
- Связность — между любыми двумя вершинами существует путь
- Отсутствие циклов — нет ни одного замкнутого маршрута вершин
- N вершин, N-1 рёбер — если в дереве N вершин, то ровно N-1 рёбер
Эквивалентные определения
Граф является деревом тогда и только тогда когда:
- Это минимальный связный граф (если удалить любое ребро, граф становится несвязным)
- Это максимальный ациклический граф (если добавить ещё одно ребро, появится цикл)
- Между любыми двумя вершинами существует ровно один простой путь
- N вершин и N-1 рёбер, и граф связен
Свойства дерева
Дерево с N вершинами имеет:
- Ровно N-1 рёбер
- Ровно одну компоненту связности
- Ноль циклов
- Может быть направленным (ориентированное дерево) или неориентированным
Примеры деревьев
1. Бинарное дерево поиска (Binary Search Tree)
5
/ \\
3 7
/ \ / \\
1 4 6 8
Это дерево:
- 8 вершин
- 7 рёбер (8-1)
- Нет циклов
- Связно
2. Структура файлов в ОС
root/
├── home/
│ ├── user/
│ │ ├── Documents/
│ │ └── Downloads/
│ └── admin/
└── var/
├── log/
└── tmp/
Это дерево:
- Корень (root)
- Иерархическая структура
- Нет циклов
3. Организационная структура
Генеральный директор
├── VP Sales
│ ├── Regional Manager 1
│ └── Regional Manager 2
├── VP Engineering
│ ├── Engineering Lead
│ │ ├── Developer 1
│ │ └── Developer 2
│ └── QA Lead
└── VP Finance
Ориентированное дерево (Rooted Tree)
В программировании часто используется ориентированное дерево с выделенным корневым узлом:
A (root)
/ \\
B C
/ \ \\
D E F
Свойства:
- Только один корень
- Каждый узел (кроме корня) имеет ровно одного родителя
- Нет циклов
Основные термины
| Термин | Значение |
|---|---|
| Корень | Выделенный узел дерева (обычно в ориентированном дереве) |
| Лист | Узел со степенью 1 (в неориентированном) или без потомков (в ориентированном) |
| Ветвь | Путь от корня к листу |
| Высота дерева | Максимальное расстояние от корня до листа |
| Глубина узла | Расстояние от корня до этого узла |
| Поддерево | Дерево, образованное узлом и всеми его потомками |
| Родитель | Узел, из которого идёт ребро к данному узлу |
| Потомки | Узлы, в которые идят рёбра от данного узла |
Типы деревьев
1. Бинарное дерево
Каждый узел имеет не более 2 потомков:
public class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}
2. Дерево поиска (BST)
Левый потомок < узел < правый потомок:
5
/ \\
3 7
/ \\ / \\
1 4 6 8
3. Сбалансированное дерево (AVL, Red-Black)
Высота левого и правого поддеревьев различается не более чем на 1:
4. N-ary дерево
Каждый узел может иметь произвольное количество потомков:
public class NaryTreeNode {
int value;
List<NaryTreeNode> children;
}
5. Trie (префиксное дерево)
Для хранения строк и поиска по префиксам:
root
/ | \\
a b c
| |
p at
| |
p s
Обход деревьев
В глубину (DFS)
public void dfs(TreeNode node) {
if (node == null) return;
// Pre-order: обработка перед рекурсией
System.out.println(node.value);
dfs(node.left);
dfs(node.right);
}
В ширину (BFS)
public void bfs(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.println(node.value);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
}
Где используются деревья
- Файловые системы — иерархия папок
- Индексы БД — B-trees, B+ trees
- Синтаксис парсеры — Abstract Syntax Tree (AST)
- DOM браузера — структура HTML элементов
- Организационные структуры — иерархия должностей
- Поиск и сортировка — Binary Search Trees
- Приоритетные очереди — Heaps
- Автодополнение — Trie структуры
Важное свойство для интервью
Если вам задали про граф с N вершинами и вы знаете что там N-1 рёбер и он связен — это гарантированно дерево. И обратно — если это дерево, то ровно N-1 рёбер.
// Проверка что граф — дерево
public boolean isTree(int numNodes, List<int[]> edges) {
// Дерево имеет ровно numNodes - 1 рёбер
if (edges.size() != numNodes - 1) return false;
// Проверяем связность (через BFS/DFS)
// Все вершины должны быть достижимы из вершины 0
return isConnected(numNodes, edges);
}
Ключевое определение для запоминания: дерево — это связный граф без циклов с N вершинами и N-1 рёбрами.