Есть такой код. Универсальный способ обхода древовидного графа. С ним я разобрался. А вот как задать граф я не понимаю.
Граф:
type ukazatel = ^tree;
tree = record
data:integer;
left:ukazatel;
right:ukazatel;
end;
var p, root:ukazatel;
k, i:integer;
procedure treego(p: ukazatel; k:integer);
begin
P^.data := k;
if p^.left<>nil then treego(p^.left, k+1);
if p^.right<>nil then treego(p^.right, k+1);
write('Done!');
end;
begin
new(root);
treego(root, 1);
end.
Щас ты строишь полное дерево,где у каждого предка существует всегда 2 потомка.Как вариант, начинаешь дополнять условия
if p^.left<>nilнапример
if p^.left<>nil and p^.data<> 5 then ......тогда у 5 круга не будет создан левый потомок.... Я точно не могу сказать, но так вроде занумеровать нельзя,так что либо вводить еще одно поле отображающее дату,а k использовать как номер в дереве, либо менять само заполнение сделав функцию, преобразующую к к нужному значению.
type ukazatel = ^tree;
tree = record
data:integer;
left:ukazatel;
right:ukazatel;
end;
procedure walk(p: ukazatel; level:integer);
begin
writeln('':2*level, p^.data);
if p^.left<>nil then walk(p^.left, level+1);
if p^.right<>nil then walk(p^.right, level+1);
end;
function it(value : integer; L, R : ukazatel) : ukazatel;
var p : ukazatel;
begin
new(p);
with p^ do
begin
data := value;
left := L;
right := R;
end;
it := p;
end;
var
root : ukazatel;
begin
root := it(2,
it(7,
it(2, nil, nil),
it(6,
it(5, nil, nil),
it(11, nil, nil)
)
),
it(5,
nil,
it(9,
it(4, nil, nil),
nil
)
)
);
walk(root, 0); { <--- Выводим, что получилось}
{ Не забудь удалить структуру }
end.
if p^.left<>nilнапример
if p^.left<>nil and p^.data<> 5 then ......тогда у 5 круга не будет создан левый потомок.... Я точно не могу сказать, но так вроде занумеровать нельзя,так что либо вводить еще одно поле отображающее дату,а k использовать как номер в дереве, либо менять само заполнение сделав функцию, преобразующую к к нужному значению.
if p^.left<>nil
P^.data := k;
type ukazatel = ^tree;
tree = record
data:integer;
left:ukazatel;
right:ukazatel;
end;
procedure walk(p: ukazatel; level:integer);
begin
writeln('':2*level, p^.data);
if p^.left<>nil then walk(p^.left, level+1);
if p^.right<>nil then walk(p^.right, level+1);
end;
function it(value : integer; L, R : ukazatel) : ukazatel;
var p : ukazatel;
begin
new(p);
with p^ do
begin
data := value;
left := L;
right := R;
end;
it := p;
end;
var
root : ukazatel;
begin
root := it(2,
it(7,
it(2, nil, nil),
it(6,
it(5, nil, nil),
it(11, nil, nil)
)
),
it(5,
nil,
it(9,
it(4, nil, nil),
nil
)
)
);
walk(root, 0); { <--- Выводим, что получилось}
{ Не забудь удалить структуру }
end.
У дерева не очень принято называть этот элемент "голова" или "хвост". Обычно у деревьев бывает "корень", из которого все и растёт. Вот тут как раз и есть Root (в переводе - корень)
uses GraphABC;
type
ukazatel = ^tree;
tree = record
x: integer;
y: integer;
left: ukazatel;
right: ukazatel;
data:integer;
end;
procedure walk(p: ukazatel; x,y,level,xp,yp: integer);
var s:string;
begin
if p^.left <> nil then walk(p^.left, x-(150 div level), y+30, level+1, x, y);
if p^.right <> nil then walk(p^.right, x+(150 div level), y+30, level+1, x, y);
MoveTo(x,y);
LineTo(xp,yp);
s:=IntToStr(p^.data);
p^.x := x;
p^.y := y;
Circle(x,y,13);
TextOut(x-5,y-5,s);
end;
function it(datav:integer; L, R: ukazatel): ukazatel;
var
p: ukazatel;
begin
new(p);
with p^ do
begin
left := L;
right := R;
data := datav;
end;
it := p;
end;
var
root: ukazatel;
begin
root := it(2,
it(7,
it(2, nil, nil),
it(6,
it(5, nil, nil),
it(11, nil, nil)
)
),
it(5,
nil,
it(9,
it(4, it(22, it(55, nil, nil), nil), nil),
nil
)
)
);
walk(root, 250, 250, 1, 250, 250);
end.
Удалсть структуру - это значит удалить память, занимаемую её, то есть сделать Dispose для всех узлов-указателей, составляющих её.