КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Примеры реализации операций
II. Поиск узла с заданным значением ключевого поля При осуществлении этой операции необходимо совершить обход дерева. Необходимо учитывать различные формы записи дерева: префиксную, инфиксную и постфиксную. Возникает вопрос: каким образом представить узлы дерева, чтобы было наиболее удобно работать с ними? Можно представлять дерево с помощью массива, где каждый узел описывается величиной комбинированного типа, у которой информационное поле символьного типа и два поля ссылочного типа. Но это не совсем удобно, так как деревья имеют большое количество узлов, заранее не определенное. Поэтому лучше всего при описании дерева использовать динамические переменные. Тогда каждый узел представляется величиной одного типа, которая содержит описание заданного количества информационных полей, а количество соответствующих полей должно быть равно степени дерева. Логично отсутствие потомков определять ссьшкой nil. Тогда на языке Pascal описание бинарного дерева может выглядеть следующим образом: TYPE TreeLink = ^Tree; Tree = record; Inf: <тип данных>; Left, Right: TreeLink; End. 1. Построить дерево из n узлов минимальной высоты, или идеально сбалансированное дерево (количество узлов левого и правого поддеревьев такого дерева должны отличаться не более чем на единицу). Рекурсивный алгоритм построения: 1) первый узел берется в качестве корня дерева. 2) тем же способом строится левое поддерево из nl узлов. 3) тем же способом строится правое поддерево из nr узлов; nr = n – nl – 1. В качестве информационного поля будем брать номера узлов, вводимые с клавиатуры. Рекурсивная функция, реализующая данное построение, будет выглядеть следующим образом: Function Tree(n: Byte): TreeLink; Var t: TreeLink; nl,nr,x: Byte; Begin If n = 0 then Tree:= nil Else Begin nl:= n div 2; nr = n – nl – 1; writeln('Введите номер вершины '); readln(x); new(t); t^.inf:= x; t^.left:= Tree(nl); t^.right:= Tree(nr); Tree:= t; End; {Tree} End. 2. В бинарном упорядоченном дереве найти узел с заданным значением ключевого поля. Если такого элемента в дереве нет, то добавить его в дерево. Procedure Search(x: Byte; var t: TreeLink); Begin If t = nil then Begin New(t); t^inf:= x; t^.left:= nil; t^.right:= nil; End Else if x < t^.inf then Search(x, t^.left) Else if x > t^.inf then Search(x, t^.right) Else Begin {обработка найденного элемента} … End; End. 3. Написать процедуры обхода дерева в прямом, симметричном и обратном порядке соответственно. 3.1. Procedure Preorder(t: TreeLink); Begin If t <> nil then Begin Writeln(t^.inf); Preorder(t^.left); Preorder(t^.right); End; End; 3.2. Procedure Inorder(t: TreeLink); Begin If t <> nil then Begin Inorder(t^.left); Writeln(t^.inf); Inorder(t^.right); End; End. 3.3. Procedure Postorder(t: TreeLink); Begin If t <> nil then Begin Postorder(t^.left); Postorder(t^.right); Writeln(t^.inf); End; End. 4. В бинарном упорядоченном дереве удалить узел с заданным значением ключевого поля. Опишем рекурсивную процедуру, которая будет учитывать наличие требуемого элемента в дереве и количество потомков этого узла. Если удаляемый узел имеет двух потомков, то он будет заменен самым большим значением ключа в его левом поддереве, и только после этого он будет окончательно удален. Procedure Delete1(x: Byte; var t: TreeLink); Var p: TreeLink; Procedure Delete2(var q: TreeLink); Begin If q^.right <> nil then Delete2(q^.right) Else Begin p^.inf:= q^.inf; p:= q; q:= q^.left; End; End; Begin If t = nil then Writeln('искомого элемента нет') Else if x < t^.inf then Delete1(x, t^.left) Else if x > t^.inf then Delete1(x, t^.right) Else Begin P:= t; If p^.left = nil then t:= p^.right Else If p^.right = nil then t:= p^.left Else Delete2(p^.left); End; End.
Дата добавления: 2017-01-14; Просмотров: 157; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |