Двоичные деревья в Паскале

Ответить
Paulo
Сообщения: 6
Зарегистрирован: 29 апр 2009, 19:34

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

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


ниже код

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.
samec2011
Сообщения: 70
Зарегистрирован: 14 май 2009, 08:24

Стучите в асю 11один11-5шесть5шесть, обсудим.
Paulo
Сообщения: 6
Зарегистрирован: 29 апр 2009, 19:34

ася сейчас не работает(((
давайте тут
Ответить