![]() |
|
Главная Промышленная автоматика. Используя этот тип данных узлов двоичного дерева, функцию create (листинг 3.9) можно переписать так, как показано в следующем листинге. Листинг 3.11. Код функции create при реализации двоичного дерева с помощью указателей function create ( lefttree, righttree: tnode) : tnode; var root: Tnode; begin new{root) ; roott. leftchild:= lefttree; roott .rightchild:- righttree; roott .parent: 0; lefttreeT.parent: = root; j-igAttreet.parent: = root; return (root) end; { create } Упражнения 3.1. Ответьте на следующие вопросы о дереве, показанном на рис. 3.18: а) какие узлы этого дерева являются листьями? б) какой узел является корнем дерева? в) какой узел является родителем узла С? г) назовите сыновей узла С; д) назовите предков узла Е\ е) назовите потомков узла Е; ж) какие узлы являются правыми братьями узлов D и Е? з) какие узлы лежат слева и справа от узла G? и) какова глубина узла С? к) какова высота узла С? ![]() М N Рис. 3.18. Дерево 3.2. Сколько путей длины 3 существует на дереве, показанном на рис. 3.18? 3.3. Напищите программы вычисления высоты дерева с использованием трех представлений деревьев, описанных в разделе 3.3. 3.4. 3.5. 3.6. 3.7. *3.8. 3.9. Составьте списки узлов дерева, представленного на рис. 3.18, при обходе этого дерева а) в прямом порядке; б) в обратном порядке; в) во внутреннем порядке. Пусть два различных узла тип принадлежат одному и тому же дереву. Покажите, что только одно из следующих утверждений может быть истинным: а) узел т расположен слева от узла га; б) узел т расположен справа от узла п; в) узел т - истинный предок узла п; г) узел т - истинный потомок узла п. Поставьте галочку в ячейку на пересечении строки / и столбца j, если одновременно выполняются условия, представленные в заголовках строки / и столбца j. Узел п предшествует узлу т. при обходе дерева в обратном порядке Узел га предшествует узлу т при обходе дерева в прямом порядке Узел п предшествует узлу т при симметричном обходе дерева Узел п расположен слева от узла т. Узел п расположен справа от узла т Узел п - истинный предок уЗЛа т Узел п - истинный потомок УЗЛа т Например, поставьте галочку в ячейку на пересечение третьей строки и второго столбца, если уверены, что узел п может быть истинным предком узла т и в тоже время предшествовать узлу т при обходе дерева в обратном порядке. Предположим, что есть массивы PREORDER[ra], INORDER[ra] и POSTORDER[n], содержащие списки узлов дерева, полученные при его обходе в прямом, внутреннем и обратном порядке соответственно. Используя эти массивы, опишите алгоритм, который для любой пары узлов / и j определяет, является ли узел i предком узла / Существует способ проверить, является ли один узел истинным предком другого узла, который основан на следующем правиле: узел т является истинным предком узла п, если узел т. предшествует узлу п при обходе дерева в X порядке, но следует за узлом п при обходе в Y порядке, где X и Y выбираются из множества {прямом, обратном, внутреннем). Определите все возможные пары X и Y, когда это правило справедливо. Напишите программы обхода двоичных деревьев а) в прямом порядке; б) в обратном порядке; в) во внутреннем порядке. 3.10. При прохождении дерева в порядке уровней в список узлов сначала заносится корень дерева, затем все узлы глубины 1, далее все узлы глубины 2 и т.д. Узлы одной глубины заносятся в список узлов в порядке слева направо. Напишите программу обхода деревьев в порядке уровней. 3.11. Преобразуйте выражение {(а + Ь) + с * (d + е) +f) * (g + h) а) в префиксную форму; б) в постфиксную форму. 3.12. Нарисуйте дерево, соответствующее префиксным выражениям а) *а + Ь*с + de\ б) *а + *Ь + cde. 3.13. Пусть Т - дерево, в котором каждый узел, не являющийся листом, имеет ровно двух сыновей. Напишите программы преобразования а) списка узлов дерева Т, составленного при обходе дерева в прямом порядке, в список, составленный при обходе в обратном порядке; б) списка узлов дерева Т, составленного при обходе дерева в обратном порядке, в список, составленный при обходе в прямом порядке; в) списка узлов дерева Т, составленного при обходе дерева в прямом порядке, в список, составленный при симметричном обходе. 3.14. Напишите программу вычисления арифметических выражений при обходе дерева а) в прямом порядке; б) в обратном порядке. 3.15. Двоичное дерево можно определить как АТД со структурой двоичного дерева и операторами LEFTCHILD(ra), RIGHTCHILD(ra), PARENT(n) и NULL(ra). Первые три оператора возвращают соответственно левого сына, правого сына и родителя узла п (если такового нет, то возвращается Л). Последний оператор возвращает значение true тогда и только тогда, когда дерево с корнем п является нулевым. Реализуйте эти операторы для двоичного дерева, представленного в табл. 3.1. 3.16. Напишите процедуры для семи операторов деревьев из раздела 3.2, используя следующие реализации деревьев: а) указатели на родителей; б) список сыновей; в) указатели на самого левого сына и на правого брата. 3.17. Степенью узла называется количество его сыновей. Покажите, что в произвольном двоичном дереве количество листьев на единицу больше числа узлов со степенью 2. 3.18. Докажите, что в любом двоичном дереве высотой h количество узлов не пре- вышает 2" - 1. Двоичное дерево высотой h с максимально возможным количеством узлов называется полным двоичным деревом. *3.19. Предположим, что дерево реализуется с помощью указателей на самого левого сына, на правых братьев и на родителя. Разработайте алгоритмы обхода деревьев в прямом, обратном и внутреннем порядке, не используя при этом стека, как сделано в листинге 3.3. 3.20. Пусть символы а, Ь, с, d, е и f имеют вероятности появления соответственно 0.07, 0.09, 0.12, 0.22, 0.23, 0.27. Найдите оптимальный код Хаффмана и нарисуйте соответствующее ему дерево. Какова средняя длина кода? 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [29] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 0.002 |