Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program TesteBlattMax (input, output);
- type
- tNatZahl = 1..maxint;
- tRefBinBaum = ^tBinBaum;
- tBinBaum = record
- Wert:tNatZahl;
- links:tRefBinBaum;
- rechts:tRefBinBaum
- end;
- var
- Wurzel : tRefBinBaum;
- blaetterSindMax : Boolean;
- function BlattMax ( inRefWurzel : tRefBinBaum; inPfadMax : tNatZahl) : Boolean;
- { prüft ob alle Blätter des Baumes die Maxima der Pfade zu ihnen sind } var
- PfadMax : integer;
- Ergebnis : boolean;
- begin
- { Überprüfen, ob ein leerer Baum übergeben wurde. Wenn das der Fall ist wird true zurückgegeben. Laut Aufgabenstellung wird zwar immer ein Baum mit zwei Knoten übergeben, aber zur Sicherheit ist es immer besser die eingabe Werte zu überprüfen. }
- if inRefWurzel = nil then
- BlattMax := true
- else
- begin
- { Maximum des aktuellen Pfades bestimmen. }
- if inPfadMax > inRefWurzel^.Wert then
- PfadMax := inPfadMax
- else
- PfadMax := inRefWurzel^.Wert;
- if (inRefWurzel^.links = nil) and (inRefWurzel^.rechts = nil) then
- { Blatt gefunden. }
- BlattMax := (PfadMax = inRefWurzel^.Wert)
- else
- { Aktueller Knoten ist kein Blatt. }
- begin
- Ergebnis := true; { Initialisierung von Ergebnis. }
- if (inRefWurzel^.links <> nil) then
- { Wenn es einen linken Teilbaum gibt, dann hier nach einem Blatt suchen und das Maximum bestimmen. }
- Ergebnis := BlattMax(inRefWurzel^.links, PfadMax);
- if Ergebnis = true then
- { Ist Ergebnis false, dann braucht der Rest des Baumes nicht weiter überprüft werden. }
- if (inRefWurzel^.rechts <> nil) then
- { Wenn es einen rechten Teilbaum gibt, dann hier nach einem Blatt suchen und das Maximum bestimmen. }
- Ergebnis := BlattMax(inRefWurzel^.rechts, PfadMax);
- BlattMax := Ergebnis
- end { if (inRefWurzel^.links = nil) and (inRefWurzel^.rechts = nil) }
- end { if inRefWurzel = nil then }
- end; { BlattMax}
- procedure BaumAufbauen (var outWurzel : tRefBinBaum) ;
- var
- index,
- Zahl : integer;
- elter, neuerKnoten : tRefBinBaum;
- function KnotenVonIndex (baum : tRefBinBaum; index : integer) : tRefBinBaum;
- var
- elter : tRefBinBaum;
- begin
- if (index = 1) then
- KnotenVonIndex := baum
- else
- begin
- elter := KnotenVonIndex(baum, index div 2);
- if ( (index mod 2 ) = 0 ) then
- KnotenVonIndex := elter^.links
- else
- KnotenVonIndex := elter^.rechts
- end;
- end;
- begin
- read (index);
- new (outWurzel);
- read (Zahl);
- outWurzel^.Wert := Zahl;
- read (index);
- while (index <> 0) do
- begin
- elter := KnotenVonIndex(outWurzel, index div 2);
- new (neuerKnoten);
- read (Zahl);
- neuerKnoten^.Wert := Zahl;
- if ( (index mod 2 ) = 0 ) then
- elter^.links := neuerKnoten
- else
- elter^.rechts := neuerKnoten;
- read (index);
- end;
- end; { BaumAufbauen }
- begin
- writeln('Bitte Baum in level-order eingeben Eingabeformat: Immer erst der Index eines Knotens, dann dessen Wert:');
- BaumAufbauen (Wurzel);
- blaetterSindMax := BlattMax(Wurzel, 1);
- if blaetterSindMax then
- writeln ('Alle Blaetter sind groesser als alle Knoten auf den jeweiligen Pfaden zu ihnen.')
- else
- writeln ('Mind. ein Blatt ist nicht groesser als alle Knoten auf seinem Pfad.');
- end. { TesteBBKnotenzahl }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement