HTML Diff
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>