Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2009, 23:31   #1
Paulo
 
Регистрация: 29.04.2009
Сообщений: 5
По умолчанию Двоичные деревья в Паскале

Сформировать двоичное дерево поиска из целых чисел. Удалить из него элемент, равный введенному пользователем. Результат вывести, используя обход сверху вниз.

Программа формирует дерево, удаляет элемент и выводит. Проблема в том что выводит не то, что должна выводить, то есть "левые" цифры. Исправить сам никак не могу.


ниже код

program laba13;

type
TreePointer = ^tree;
tree = record
data: char;
left: TreePointer;
right:TreePointer;
end;


function Stree(root,r:TreePointer;data:char) :TreePointer;{//функкцика}
begin
if r=nil then
begin
new(r); { получить новую вершину }
r^.left:=nil;
r^.right:=nil;
r^.data:=data;
if data<root^.data then root^.left:=r
else root^.right:=r;
STree:=r;
end else
begin
if data<r^.data then STree:=STree(r, r^.left, data)
else STree:=STree(r, r^.right, data);
end;
end;

function DTree(root:TreePointer;key:char):Tr eePointer;{//функция удая вершина корнем поддерев}
var
temp,temp2:TreePointer;

begin
if root^.data = key then
begin
if root^.left=root^.right then
begin
dispose(root);
DTree:= nil;
end
else
if root^.left=nil then
begin
temp := root^.right;
dispose(root);
DTree := temp;
end
else
if root^.right=nil then
begin
temp := root^.left;
dispose(root);
DTree := temp;
end
else
begin { имеются два листа }
temp2 := root^.right;
temp := root^.right;
while temp^.left <> nil do temp := temp^.left;
temp^.left := root^.left;
dispose(root);
DTree := temp2;
end;
begin
if root^.data < key
then root^.right := DTree(root^.right, key)
else root^.left := DTree(root^.left, key);
DTree := root;
end;
end;
end;


procedure PrintTree(r: TreePointer;n: integer);{ //процедура вывода элементов дерева}
var
i:integer;
begin
if r<>nil then
begin
PrintTree(r^.left, n+1);
for i := 1 to n do
begin
Write(' ');
Writeln(r^.data);
end;
PrintTree(r^.right, n+1);
end;
end;



Var root, dummy: TreePointer;
r: char;

Begin
WriteLn('Isert the elements of tree or 0 to quit');{//считываем цифры в дерево, пока пользователь не введет 0 }
repeat
ReadLn(r);
if root= nil then root := STree(root, root, r )
else dummy := STree(root, root, r);
until r='0';
WriteLn('Insert the element to delete');
Readln(r);
dummy:=Dtree(root,r);{//удаляем введенную вершниу }
PrintTree(root,0);{//печатаем на экране }


end.
Paulo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двоичные деревья Raz0r Помощь студентам 7 11.12.2011 10:32
Двоичные деревья. 3 задачки. Срочно rustam29 Фриланс 9 13.06.2009 18:02
Динамические структуры данных. Стеки. Очереди. Двоичные деревья. Paulo Помощь студентам 0 30.04.2009 06:12