29.Prednaska/Cvicenie0: Rozdiel medzi revíziami

Z Pascal
Prejsť na: navigácia, hľadanie
Riadok 67: Riadok 67:
 
: lepšie robiť na košatejšom strome
 
: lepšie robiť na košatejšom strome
  
:* ako vyzerá Preorder a Inorder výpis
 
* metódy - rekurzívne aj nerekurzívne
 
  
: function TBVS.Max: Integer;
+
* aritmetické stromy
: function Hladaj(Hodnota: Integer): TVrchol;
+
  
 +
* ako vyzerá Preorder a Inorder výpis
 +
: ukázať najprv na tabuli napr. na 5, 7, 2, 4
 +
: vypísať inorder na spodok canvasu
 +
Image1.Canvas.TextOut(0, Image1.Height - 20, Strom.Inorder)
  
* aritmetické stromy
+
* nakresliť na tabuľu strom aritmetického výrazu 5+7/(4-2*5)
 +
* '+ * 4 5 - 7 9'
 +
* a('+', a('*', b(4), b(5)), a('-', b(7), b(9)))
 +
: programujeme v prefixe, myslíme v infixe
 +
: postfix najrozumnejší z pohľadu vyhodnocovania
  
 +
: volanie vnorených je preorder
  
 
* lexikografické stromy
 
* lexikografické stromy
 +
* na tabuľu strom obsahujúci
 +
: písmená samozrejme nepíšeme do vrcholov, ale na hrany
 +
aab
 +
cbb
 +
cab
 +
bba
 +
bbb
  
 
+
: vzorová úloha na teste: počet listov, hĺbka lexikografického stromu pre
 +
mama
 +
ma
 +
emu
 +
a
 +
ema
 +
ma
 +
mamu
 
{{Podnadpis|ďalšie námety}}
 
{{Podnadpis|ďalšie námety}}
  
Riadok 87: Riadok 107:
 
=== Domáca úloha ===
 
=== Domáca úloha ===
  
 
+
* konštruktor, ktorý ako parameter dostáva string so zápisom aritmetického stromu v prefixe oddelený medzerami a vytvorí BVS
1.
+
'+ * 4 5000 - 712 94'
 +
: zrejme budeme musieť použiť rekurziu
 +
: čísla môžu byť aj viacciferné
 +
AStrom := v('+', v('*', c(4), c(5)), v('-', c(7), c(9)));
 +
//Astrom := Vytvor('+ * 4 5 - 7 9');
 +
Memo1.Lines.Add('Prefix = ' + AStrom.Prefix);
 +
Memo1.Lines.Add('Infix = ' + AStrom.Infix);
 +
Memo1.Lines.Add('Hodnota = ' + AStrom.Hodnota);

Verzia zo dňa a času 09:46, 15. marec 2013

29. Cvičenie


< 29.Prednáška | riešené úlohy


Rozcvička

1. binárny strom je definovaný

TStrom = class
  Info: Integer;
  L, P: TStrom;
  • napísať metódu TStrom.Urob, ktorá upraví hodnoty vo vrcholoch (Info) stromu takto:
  • vo všetkých listoch bude hodnota 1
  • vo vnútorných listoch bude hodnota, ktorá je maximálna z hodnôt jeho synov zvýšené o 1 (alebo súčtom synov)


Cvičenie

  • BVS
type
  TBVS = class
    Koren: TVrchol;
  end;
  • ručne vytvoriť, ak postupne pridávame: 6, 2, 4, 7, 3, 9, 5, 8, 1
  • pridať 6.5, 1.5, 5.5
  • rozchodiť aplikáciu z prednášky a vytvoriť v nej uvedený strom
  • nájsť minimálny vrchol stromu
function TBVS.Min: Integer;
begin
 Result := koren;
	if Result <> nil then
		while Result.L <> Result do
			Result :=  Result.L;
end;
na vykreslenie minima treba mať v TForm1.Kresli podporu
všimnite si, že počet krokov while cyklu bude maximálne hĺbka stromu
var
	M: TVrchol;
begin
	M := Strom.min;
	if M <> nil then
		Image1.Canvas.TextOut(0, 0, 'min = ' + M.Text)
end;
  • verzia Vloz s dynamickým poľom ako parametrom
function TVBStrom.Vloz(Hodnota: array of Integer)
var
	h: Integer;
begin
	for h in Hodnota do
		Vloz(h);
end;
otestujeme
begin
Strom.Vloz([6, 2, 4, 7, 3, 9, 5, 8, 1])
	Vloz(h);
end;
  • ručne vyhadzovať vrchol zo stromu
ak má dvoch synov, minimum pravého podstromu sa presťahuje do vrcholu + potrebné upratovanie
lepšie robiť na košatejšom strome


  • aritmetické stromy
  • ako vyzerá Preorder a Inorder výpis
ukázať najprv na tabuli napr. na 5, 7, 2, 4
vypísať inorder na spodok canvasu
Image1.Canvas.TextOut(0, Image1.Height - 20, Strom.Inorder)
  • nakresliť na tabuľu strom aritmetického výrazu 5+7/(4-2*5)
  • '+ * 4 5 - 7 9'
  • a('+', a('*', b(4), b(5)), a('-', b(7), b(9)))
programujeme v prefixe, myslíme v infixe
postfix najrozumnejší z pohľadu vyhodnocovania
volanie vnorených je preorder
  • lexikografické stromy
  • na tabuľu strom obsahujúci
písmená samozrejme nepíšeme do vrcholov, ale na hrany
aab
cbb
cab
bba
bbb
vzorová úloha na teste: počet listov, hĺbka lexikografického stromu pre
mama
ma
emu
a
ema
ma
mamu


ďalšie námety



Domáca úloha

  • konštruktor, ktorý ako parameter dostáva string so zápisom aritmetického stromu v prefixe oddelený medzerami a vytvorí BVS
'+ * 4 5000 - 712 94'
zrejme budeme musieť použiť rekurziu
čísla môžu byť aj viacciferné
AStrom := v('+', v('*', c(4), c(5)), v('-', c(7), c(9)));
//Astrom := Vytvor('+ * 4 5 - 7 9');
Memo1.Lines.Add('Prefix = ' + AStrom.Prefix);
Memo1.Lines.Add('Infix = ' + AStrom.Infix);
Memo1.Lines.Add('Hodnota = ' + AStrom.Hodnota);