0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Файловая структура - пример дерева, с которым знакомы все, кто пользуется компьютером. Она состоит из директорий и разного вида файлов:</p>
1
<p>Файловая структура - пример дерева, с которым знакомы все, кто пользуется компьютером. Она состоит из директорий и разного вида файлов:</p>
2
<p>В этом уроке мы начнем знакомиться с деревьями и обсудим, по какому принципу они работают.</p>
2
<p>В этом уроке мы начнем знакомиться с деревьями и обсудим, по какому принципу они работают.</p>
3
<h2>Как устроены деревья</h2>
3
<h2>Как устроены деревья</h2>
4
<p>Выше вы увидели файловую систему. Деревом она называется из-за своей структуры. Все элементы файловой системы выстраиваются в иерархию. В ней на верхнем уровне находится корневая директория или диск, если речь идет про Windows. Далее расположены файлы и директории, которые сами по себе могут содержать файлы и директории.</p>
4
<p>Выше вы увидели файловую систему. Деревом она называется из-за своей структуры. Все элементы файловой системы выстраиваются в иерархию. В ней на верхнем уровне находится корневая директория или диск, если речь идет про Windows. Далее расположены файлы и директории, которые сами по себе могут содержать файлы и директории.</p>
5
<p>Ключевая черта древовидной структуры в том, что она<strong>рекурсивна</strong>. Другими словами, дерево состоит из поддеревьев, которые в свою очередь состоят из поддеревьев, которые в свою очередь состоят из поддеревьев и так далее.</p>
5
<p>Ключевая черта древовидной структуры в том, что она<strong>рекурсивна</strong>. Другими словами, дерево состоит из поддеревьев, которые в свою очередь состоят из поддеревьев, которые в свою очередь состоят из поддеревьев и так далее.</p>
6
<p>Эта особенность определяет основные способы работы с деревьями в коде, все они работают рекурсивно.</p>
6
<p>Эта особенность определяет основные способы работы с деревьями в коде, все они работают рекурсивно.</p>
7
<p>Перейдем к основным терминам. Само дерево состоит из двух компонентов.</p>
7
<p>Перейдем к основным терминам. Само дерево состоит из двух компонентов.</p>
8
<p>Первый компонент - это<strong>узлы</strong>, они же вершины или ноды. Узлы делятся на два типа:</p>
8
<p>Первый компонент - это<strong>узлы</strong>, они же вершины или ноды. Узлы делятся на два типа:</p>
9
<ul><li><strong>Внутренние</strong>- те, у которых есть потомки</li>
9
<ul><li><strong>Внутренние</strong>- те, у которых есть потомки</li>
10
<li><strong>Листовые</strong>- те, у которых нет потомков</li>
10
<li><strong>Листовые</strong>- те, у которых нет потомков</li>
11
</ul><p>В случае файловой системы листовые узлы представлены файлами, а внутренние - директориями.</p>
11
</ul><p>В случае файловой системы листовые узлы представлены файлами, а внутренние - директориями.</p>
12
<p>Второй компонент -<strong>ребра</strong>между узлами. В реальности ребра не существуют. Они нужны лишь для того, чтобы визуализировать связь и по необходимости описывать ее.</p>
12
<p>Второй компонент -<strong>ребра</strong>между узлами. В реальности ребра не существуют. Они нужны лишь для того, чтобы визуализировать связь и по необходимости описывать ее.</p>
13
<p>Так узлы и ребра выглядят на схеме:</p>
13
<p>Так узлы и ребра выглядят на схеме:</p>
14
<p>У каждой вершины в дереве есть<strong>родитель</strong>. Единственное исключение - это корневой узел. У него нет родителей, потому что именно с него начинается дерево.</p>
14
<p>У каждой вершины в дереве есть<strong>родитель</strong>. Единственное исключение - это корневой узел. У него нет родителей, потому что именно с него начинается дерево.</p>
15
<p>Еще у вершины могут быть<strong>потомки</strong>в любом количестве.</p>
15
<p>Еще у вершины могут быть<strong>потомки</strong>в любом количестве.</p>
16
<p>Кроме того, в деревьях выделяют понятие<strong>глубина</strong>. Она определяет, сколько шагов нужно пройти по вершинам от корневой, чтобы достичь текущей вершины (той, на которую смотрим).</p>
16
<p>Кроме того, в деревьях выделяют понятие<strong>глубина</strong>. Она определяет, сколько шагов нужно пройти по вершинам от корневой, чтобы достичь текущей вершины (той, на которую смотрим).</p>
17
<p>Вершины, находящиеся на одной глубине и имеющие общего родителя, называют<strong>братскими</strong>или<strong>сестринскими</strong>.</p>
17
<p>Вершины, находящиеся на одной глубине и имеющие общего родителя, называют<strong>братскими</strong>или<strong>сестринскими</strong>.</p>
18
<h2>Реализация через вложенные кортежи</h2>
18
<h2>Реализация через вложенные кортежи</h2>
19
<p>Описать деревья можно огромным количеством способов. Самый примитивный вариант - это вложенные кортежи:</p>
19
<p>Описать деревья можно огромным количеством способов. Самый примитивный вариант - это вложенные кортежи:</p>
20
<p>В примерах выше корень - это сам кортеж, а все его элементы - это потомки. Если потомок не является кортежем, то он рассматривается как листовой узел, иначе - как внутренний узел. В свою очередь, внутренний узел состоит из потомков.</p>
20
<p>В примерах выше корень - это сам кортеж, а все его элементы - это потомки. Если потомок не является кортежем, то он рассматривается как листовой узел, иначе - как внутренний узел. В свою очередь, внутренний узел состоит из потомков.</p>
21
<p>Любое дерево состоит из двух больших частей:</p>
21
<p>Любое дерево состоит из двух больших частей:</p>
22
<ol><li>Данных, которые хранятся внутри дерева</li>
22
<ol><li>Данных, которые хранятся внутри дерева</li>
23
<li>Структуры дерева, которые отвечают за связи между данными</li>
23
<li>Структуры дерева, которые отвечают за связи между данными</li>
24
</ol><p>Рассмотрим такой пример:</p>
24
</ol><p>Рассмотрим такой пример:</p>
25
<p>Что в этом дереве структура, а что данные? Данные здесь - листовые узлы, а вот внутренние кортежи - исключительно структура. Они определяют, где какие файлы находятся, но сами не содержат никаких данных.</p>
25
<p>Что в этом дереве структура, а что данные? Данные здесь - листовые узлы, а вот внутренние кортежи - исключительно структура. Они определяют, где какие файлы находятся, но сами не содержат никаких данных.</p>
26
<p>Подобная организация дерева непригодна для хранения файловой структуры. Как минимум это дерево не позволяет задать имя для директории.</p>
26
<p>Подобная организация дерева непригодна для хранения файловой структуры. Как минимум это дерево не позволяет задать имя для директории.</p>
27
<p>Расширим структуру так, чтобы она позволяла добавлять больше информации. Представим каждый элемент дерева парой:</p>
27
<p>Расширим структуру так, чтобы она позволяла добавлять больше информации. Представим каждый элемент дерева парой:</p>
28
<ul><li>Первый элемент - это значение, хранящееся в узле</li>
28
<ul><li>Первый элемент - это значение, хранящееся в узле</li>
29
<li>Второй элемент - список потомков</li>
29
<li>Второй элемент - список потомков</li>
30
</ul><p>Если второй элемент отсутствует, то считаем, что текущий узел - листовой:</p>
30
</ul><p>Если второй элемент отсутствует, то считаем, что текущий узел - листовой:</p>
31
<p>Такой вариант многословнее, но позволяет хранить данные в любом узле, даже не листовом. Причем это не обязательно должна быть строка, как в примере выше. Изменение данных на словари позволит добавлять туда все что угодно.</p>
31
<p>Такой вариант многословнее, но позволяет хранить данные в любом узле, даже не листовом. Причем это не обязательно должна быть строка, как в примере выше. Изменение данных на словари позволит добавлять туда все что угодно.</p>
32
<h2>Реализация через словари</h2>
32
<h2>Реализация через словари</h2>
33
<p>Самый гибкий и удобный способ представления деревьев - это словари. В таком дереве каждый узел - это словарь, а списки используются только для хранения потомков:</p>
33
<p>Самый гибкий и удобный способ представления деревьев - это словари. В таком дереве каждый узел - это словарь, а списки используются только для хранения потомков:</p>
34
<p>По большому счету, список и словарь сами по себе всегда могут рассматриваться как деревья. Это справедливо для любой рекурсивной структуры данных - то есть для такой структуры, элементами которой может быть сама структура.</p>
34
<p>По большому счету, список и словарь сами по себе всегда могут рассматриваться как деревья. Это справедливо для любой рекурсивной структуры данных - то есть для такой структуры, элементами которой может быть сама структура.</p>
35
<p>В любом списке может содержаться список, как и в любом словаре может содержаться словарь.</p>
35
<p>В любом списке может содержаться список, как и в любом словаре может содержаться словарь.</p>