Программирование Деревья

















Программирование Деревья
№ 2 Морис Эшер Три мира
№ 3 Деревья -- структуры данных, определяемые с помощью рекурсии. Древовидная структура (дерево) определяется следующим образом: дерево (tree) с базовым типом T — это: • либо пустая структура; • либо узел типа T, с которым связано конечное число древовидных структур, называемых поддеревьями (subtree). Если с узлом связаны только два поддерева, то дерево называется бинарным.
№ 4
№ 5 Терминология (1) Из ботаники взяты такие определения: • узел (node) — это точка, где может возникнуть ветвь. • корень (root) — "верхний" узел дерева. ; • ветвь (brunch) — отрезок, описывающий связь между двумя узлами; • лист (leaf) — узел, из которого не выходят ветви, т. е. не имеющий поддеревьев.
№ 6 Терминология (2) Термины, взятые из генеалогии, описывают отношения: • родительским (parent) называется узел, который находится непосредственно над другим узлом; • дочерним (child) называется узел, который находится непосредственно под другим узлом; дочерний узел также называют сыном (что не меняет "родственности" отношений); • предки данного узла — это все узлы на пути вверх от данного узла до корня; • потомки — все узлы, расположенные ниже данного; • сестринские (братские) — узлы, у которых один и тот же родитель.
№ 7 Терминология (3) Список терминов, возникших в программировании: • внутренний узел (internal node) — узел, не являющийся листом; • порядок узла (node degree) — количество его дочерних узлов; • глубина (depth) узла — количество его предков плюс единица; • глубина (высота) дерева — максимальная глубина всех узлов; • длина пути к узлу — количество ветвей, которые нужно пройти, чтобы продвинуться от корня к данному узлу; • длина пути дерева — сумма длин путей всех его узлов. Она также называется длиной внутреннего пути.
№ 8 Основные операции с бинарными деревьями При работе программы дерево может модифицироваться: добавляются или удаляются узлы, меняются информационные части узлов. То есть дерево является динамической структурой. Поэтому узел дерева определяется как переменная с фиксированной структурой, содержащей информационную часть и две ссылки, указывающие на левое и правое поддеревья данного узла. Ссылка на пустое дерево равна nil.
№ 9 Описание узла дерева type TInfo = Integer; // тип информационного поля PTree = ^TTree; TTree = record info : Tinfo; // значение ключа left, right: PTree; // ссылки на левое и правое поддеревья end;
№ 10 Алгоритмы обхода дерева Такой алгоритм — это метод, позволяющий получить доступ к каждому узлу дерева один и только один раз. Для каждого узла выполняются некоторые виды обработки (проверка, суммирование и т. п. ), однако способ обхода не зависит от конкретных действий и является общим для всех алгоритмов обработки узлов.
№ 11 Существуют три способа посещения всех узлов, использующие обход в глубину: Обход_сверху_вниз (Pre. Order): • обработать корень; • Обход_сверху_вниз левого поддерева; • Обход_сверху_вниз правого поддерева. Обход_слева_направо (In. Order): • Обход_слева_направо левого поддерева; • обработать корень; • Обход_слева_направого поддерева. Обход_снизу_вверх (Post. Order): • Обход_снизу_вверх левого поддерева; • Обход_снизу_вверх правого поддерева; • обработать корень.
Процедуры обхода дерева procedure Pre. Order(Tree: PTree); // Сверху вниз begin if Tree <> nil then begin Proc(Tree^); // обработка узла Pre. Order(Tree^. left); Pre. Order(Tree^. right); end; procedure In. Order(Tree: PTree); // Слева направо begin if Tree <> nil then begin In. Order(Tree^. left); Proc(Tree^); // обработка узла In. Order(Tree^. right); end; procedure Post. Order(Tree: PTree); // Снизу вверх begin if Tree <> nil then begin Post. Order(Tree^. left); Post. Order(Tree^. right); Proc(Tree^); // обработка узла end;
№ 13 Упорядоченное дерево Упорядоченным называется дерево, в котором для каждого узла N значение левого дочернего узла меньше, чем значение в N, а значение правого дочернего узла больше значения в N. Если в дереве могут содержаться одинаковые значения, то программист должен сам определить, влево или вправо помещать значение, равное значению в родительском узле, т. е. соответствующее строгое неравенство заменить на нестрогое.
№ 14 Сбалансированное дерево Дерево называется идеально сбалансированным , если для каждого его узла количества узлов в левом и в правом его поддеревьях различаются не более чем на 1. Разумеется, идеально сбалансированное дерево имеет минимальную высоту по сравнению со всеми другими деревьями с тем же числом узлов. . Чтобы построить такое дерево, нужно располагать максимально возможное число узлов на всех уровнях, кроме самого нижнего. Это сделать просто, если распределять узлы поровну слева и справа от каждого узла.
№ 15 Построение сбалансированного дерева Алгоритм равномерного распределения при известном числе узлов N лучше всего выбрать рекурсивным: Взять один узел в качестве корня. Построить левое поддерево с числом узлов n. Left = N div 2 тем же способом. Построить правое поддерево с числом узлов n. Right = N – n. Left - 1 тем же способом.
№ 16 function Balans. Tree(n: integer): PTree; var n. Left, n. Right: integer; begin if n=0 then Balans. Tree: =NIL else begin n. Left: =n div 2; n. Right: = n-n. Left-1; new(result); with result^ do begin info: =…. . // заполнить информационную часть left: =Balans. Tree(n. Left); right: =Balans. Tree(n. Right); end;
Задачи • Описать логическую функцию, определяющую, есть ли в заданном двоичном дереве данный элемент. • Определить, есть ли в заданном двоичном дереве хотя бы два одинаковых элемента. • Подсчитать сумму элементов на k-ом уровне заданного двоичного дерева (корень считать узлом 1 -го уровня). • Подсчитать число узлов на k-ом уровне заданного двоичного дерева (корень считать узлом 1 -го уровня). • Подсчитать минимум из чисел, содержащихся в листьях заданного двоичного дерева. • Подсчитать максимум элементов на k-ом уровне заданного двоичного дерева (корень считать узлом 1 -го уровня).

