Содержание
- 2. Деревья T1,T2,…Tm называются поддеревьями данного корня. Строго говоря, приведенное определение относится к специальному случаю дерева, называемому
- 3. Число поддеревьев узла называют его степенью. Узел нулевой степени называют листом. Уровень узла в дереве определяется
- 4. Если в определения дерева имеет значение относительный порядок следования поддеревьев T1,T2,…Tm, то дерево называют упорядоченным. Лес
- 7. Когда говорят о деревьях, часто используют такие термины, как "отец", "сын", "брат", "предок", "потомок". Каждый узел
- 8. Бинарные деревья Бинарное дерево определяется как конечное множество узлов, которое или пусто, или состоит из корня
- 9. Отметим, что деревья на рисунке различны, так как в одном случае пусто левое поддерево, а в
- 10. Обход бинарного дерева Для работы с древовидными структурами имеется множество алгоритмов, и многие из них используют
- 11. Прямой обход. 1. Обработать корень 2. Обойти левое поддерево 3. Обойти правое поддерево Обратный обход. 1.
- 12. На рис. изображены все варианты обхода.
- 13. На рис. изображено бинарное дерево и порядок следования его узлов для различных методов обхода.
- 14. Пример рекурсивной функции, выполняющей обход дерева в прямом порядке. void DirectBypass(NODE *Root){ // Root – указатель
- 15. Идея реализации алгоритма с "ручным" ведения стека (это может потребоваться, если язык не допускает рекурсии) заключается
- 16. const int MAXSTACK=50; void InverseBypass(NODE *Root){ // Нерекурсивный обход бинарного дерева NODE *stack[MAXSTACK]; NODE *s; int
- 17. if(v==0){ // стек пуст return; } // взять узел из стека s=stack[--v]; Обработка(s); // переходим к
- 18. Рассмотрим две конкретные задачи, решаемые с помощью обхода дерева. Задача 1. Копирование бинарного дерева Для решения
- 19. Задача 2. Вычисление значения выражения, заданного деревом. В качестве примера рассмотрим выражение ((2+3)*(7-4))/3. Порядок вычисления выражения
- 20. Узел дерева в поле данных содержит либо число, либо символ операции. Если узел содержит число, то
- 21. Структура узла имеет вид: const int OPERATION=0; // признак: узел содержит операцию const int NUMBER=1; //
- 22. Приведенная ниже функция вычисляет значение выражения, заданного деревом. float TreeValue(UZEL *Root){ float Result; if(Root->Tag==NUMBER) return Root->Number;
- 23. Голова дерева. Дерево, как и линейный список, может иметь голову. В таких случаях, дерево, как правило,
- 24. Прошитые деревья В бинарном дереве, содержащем N узлов, на каждый узел, кроме корня указывает ровно одна
- 25. Прошитые деревья используют место, занимаемое пустыми связями для хранения указателей, упрощающих прохождение дерева. Эти дополнительные связи
- 26. Дерево может быть прошито для обхода в одном из порядков. Рассмотрим дерево, прошитое для обхода в
- 27. const int THREAD=0; const int MAINLINK=1; struct NODE{ ; NODE *Left, *Right; BYTE L,R; };
- 28. На рис. изображено прошитое дерево. Пунктиром изображены нити.
- 29. Преимущество прошитых деревьев заключается в том, что упрощаются алгоритмы обхода. Ниже приведена функция, возвращающая указатель на
- 30. При наличии алгоритма определения последователя отпадает необходимость в стеке (явном или порождаемом механизмом реализации рекурсии). Функция,
- 31. Другие представления бинарных деревьев Подходящий выбор представления дерева в первую очередь определяется видом операций, выполняемым над
- 32. struct NODE{ ; NODE *Right; bool HaveLeftSon; }; Хранится только правая связь. Левый сын узла, если
- 34. Представление деревьев общего вида Рассмотрим два варианта представления дерева общего вида. В первом варианте для хранения
- 35. От этого недостатка свободно представление, когда указатели на сыновей находятся в линейном списке. Такая списочная структура
- 36. Пример такого дерева
- 37. Представление деревьев общего вида бинарными деревьями Всякое дерево можно представить в виде бинарного дерева. При преобразовании
- 38. В дальнейшем деревья ещё будут рассматриваться в связи с их использованием для представления таблиц.
- 40. Скачать презентацию