Hi,
i am doing my homework. I have to write a program using a balanced tree.
It is required to balance the tree.
So i wrote a function to do so.
On calling the function i get an stack overflow.
Any help ?
Thanks a lot.
My code:
program binaerbaum;
uses crt;
type name= string[12];
pointer= ^baum;
baum= record
vorname: name;
nachname: name;
rechts: pointer;
links: pointer;
end;
var zeiger: pointer;
antwort: char;
vorname: name;
nachname: name;
zaehler, d: integer;
pfad: string;
{--------------------------------------------------------------------------}
procedure einfuegen(var baumpointer:pointer; vorneu, nachneu: name);
begin
if baumpointer= nil then
begin
new(baumpointer);
baumpointer^.nachname:= nachneu;
baumpointer^.vorname:= vorneu;
baumpointer^.links:= nil;
baumpointer^.rechts:= nil;
end
else
if nachneu<baumpointer^.nachname then
einfuegen(baumpointer^.links, nachneu, vorneu)
else
einfuegen(baumpointer^.rechts, nachneu, vorneu);
end;
{--------------------------------------------------------------------------}
procedure eingabe (var vn, nn: name);
begin
clrscr;
write('Vorname: ');
readln(vn);
write('Nachname: ', vorname,', ');
readln(nn);
end;
{--------------------------------------------------------------------------}
procedure ausgabe(bpointer:pointer; var zaehler: integer; pfad: string);
begin
if bpointer <> nil then
begin
if bpointer^.links<> nil then
ausgabe(bpointer^.links, zaehler, pfad + 'L');
zaehler:= zaehler + 1;
write( zaehler:3,' ', bpointer^.nachname,', ', bpointer^.vorname);
gotoXY(50, whereY); writeln(pfad+'*');
if bpointer^.rechts<> nil then
ausgabe(bpointer^.rechts, zaehler, pfad + 'R');
end;
end;
{--------------------------------------------------------------------------}
procedure liste;
var antw: char;
begin
repeat
eingabe (vorname, nachname);
einfuegen(zeiger, nachname, vorname);
writeln('weiteren namen');
readln(antw);
until antw= 'n';
readln;
end;
{--------------------------------------------------------------------------}
procedure loeschen(var bp: pointer; vn, nn: name);
var rettel: pointer;
retter: pointer;
begin
if (nn < bp^.nachname) and (bp<> nil) then
loeschen(bp^.links, nn, vn)
else
if (nn > bp^.nachname) and (bp<> nil) then
loeschen(bp^.rechts, nn, vn)
else
if (nn= bp^.nachname) and (vn= bp^.vorname) then
begin
retter:= bp^.rechts;
rettel:= bp^.links;
dispose(bp);
bp:= retter;
while retter^.links <> nil do
retter:= retter^.links;
retter^.links:= rettel;
end
else
writeln('name nicht vorhanden');
end;
{--------------------------------------------------------------------------}
function count(baum: pointer): integer;
begin
if baum = nil then
count:= 0
else
count:= count(baum^.rechts) + count(baum^.links);
end;
{--------------------------------------------------------------------------}
procedure optimieren(var baum: pointer );
var p: pointer;
begin
while count(baum^.links)> count(baum^.rechts) do
begin
p := baum^.links;
baum^.links:= p^.rechts;
p^.rechts:= baum;
baum:= p;
end;
while count(baum^.links) < count(baum^.rechts) do
begin
p:= baum^.rechts;
baum^.rechts:= p^.links;
p^.links:= baum;
baum:= p;
end;
optimieren(baum^.links);
end;
{--------------------------------------------------------------------------}
begin
clrscr;
new(zeiger);
zeiger:= nil;
d:=0;
repeat
writeln;
writeln('W"hlen sie ihren Men punkt aus');
writeln('0.- Programende');
writeln('1.- neue Liste erstellen');
writeln('2.- Element in Baum einf gen');
writeln('3.- Element aus Baum l"schen');
writeln('4.- Baum optimieren');
writeln('5.- Baum in Datei speichern');
writeln('6.- Datei "ffnen');
readln(antwort);
case antwort of '1': begin
liste;
zaehler:= 0;
ausgabe(zeiger, zaehler, pfad);
writeln;
writeln(zaehler,'. Namen sind vorhanden');
writeln('max Pfadl"nge: ', zaehler-1);
writeln('optimale Pfadl"nge: ',
trunc(ln(zaehler)/ln(2)));
end;
'2': begin
eingabe(vorname, nachname);
einfuegen(zeiger, nachname, vorname);
zaehler:= 0;
ausgabe(zeiger, zaehler, pfad);
writeln;
writeln(zaehler,'. Namen sind vorhanden');
writeln('max Pfadl"nge:', zaehler-1);
writeln('optimale Pfadl"nge: ',
trunc(ln(zaehler)/ln(2)));
end;
'3': begin
if zeiger= nil then exit;
eingabe(vorname, nachname);
loeschen(zeiger, nachname, vorname);
zaehler:= 0;
ausgabe(zeiger, zaehler, pfad);
writeln;
writeln(zaehler,'. Namen sind vorhanden');
writeln('max Pfadl"nge:', zaehler-1);
writeln('optimale Pfadl"nge: ',
trunc(ln(zaehler)/ln(2)));
end;
'4': begin
if zeiger<> nil then
optimieren(zeiger);
end;
'5': begin
end;
'6': begin
end;
end;
until antwort= '0';
end.