Metody programowania / Ćwiczenia 3: Różnice pomiędzy wersjami
Odstepy itp. |
Poprawki do zadan na drzewa |
||
Linia 1: | Linia 1: | ||
To są zadania na drzewa. Przyjmujemy następujące definicje: | To są zadania na drzewa. Przyjmujemy następujące definicje: | ||
'''type''' el_drzewa = record | '''type''' el_drzewa = record | ||
w: integer; | |||
lsyn, psyn: ^el_drzewa; | |||
end; | |||
drzewo = ^el_drzewa; | |||
==Zadanie 1 (Liczba liści w drzewie)== | ==Zadanie 1 (Liczba liści w drzewie)== | ||
Linia 12: | Linia 11: | ||
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''function''' LiczbaLiści(d: drzewo): integer; | '''function''' LiczbaLiści(d: drzewo): integer; | ||
//Liczymy liczbe liści w drzewie | |||
'''begin''' | '''begin''' | ||
'''if''' d = nil '''then''' LiczbaLiści:=0 | '''if''' d = nil '''then''' LiczbaLiści:=0 | ||
Linia 27: | Linia 27: | ||
</div> | </div> | ||
</div>}} | </div>}} | ||
==Zadanie 2 (Odbicie lustrzane)== | ==Zadanie 2 (Odbicie lustrzane)== | ||
Linia 34: | Linia 33: | ||
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''procedure''' Lustro(d: drzewo); | '''procedure''' Lustro(d: drzewo); | ||
//Przekształcamy d na swoje odbicie lustrzane | |||
'''var''' pom: drzewo; | '''var''' pom: drzewo; | ||
'''begin''' | '''begin''' | ||
Linia 49: | Linia 49: | ||
</div> | </div> | ||
</div>}} | </div>}} | ||
==Zadanie 3 (Izomorfizm drzew)== | ==Zadanie 3 (Izomorfizm drzew)== | ||
Linia 56: | Linia 55: | ||
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''function''' Izomorficzne(d1,d2: drzewo): boolean; | '''function''' Izomorficzne(d1,d2: drzewo): boolean; | ||
//Sprawdzamy czy d1 i d2 mają taki sam kształt | |||
'''var''' i: boolean; | '''var''' i: boolean; | ||
'''begin''' | '''begin''' | ||
Linia 70: | Linia 70: | ||
''Koszt czasowy:'' liniowy ze względu na sumę wielkości drzew | ''Koszt czasowy:'' liniowy ze względu na sumę wielkości drzew | ||
''Koszt pamięciowy:'' liniowy ze względu na minimum z wysokości drzew | ''Koszt pamięciowy:'' liniowy ze względu na minimum z wysokości drzew | ||
</div> | </div> | ||
</div>}} | </div>}} | ||
==Zadanie 4 (Lista liści)== | ==Zadanie 4 (Lista liści)== | ||
Napisz funkcję wiążącą liście drzewa w listę (od lewej do prawej). Wynikiem funkcji | Napisz funkcję wiążącą liście drzewa w listę (od lewej do prawej). Wynikiem funkcji ma być wskaźnik do utworzonej listy. Zakładamy, że każdy węzeł ma dodatkowe pole będące wskaźnikiem do węzła, czyli używamy typów | ||
'''type''' węzeł = record | '''type''' węzeł = record | ||
w: integer; | |||
lsyn, psyn, nast: ^węzeł; | |||
end; | |||
drzewoL = ^węzeł; | |||
{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
Linia 90: | Linia 89: | ||
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''function''' ListaLiści(d: drzewoL): drzewoL; | '''function''' ListaLiści(d: drzewoL): drzewoL; | ||
'''var''' l: drzewoL; | //Wynikiem funkcji jest wskaźnik do listy liści (od prawej do lewej) w drzewie d | ||
'''procedure''' Lista(d: drzewoL); | '''var''' l: drzewoL; //dotychczas obliczona lista liści | ||
'''procedure''' Lista(d: drzewoL); | |||
//Jeśli węzeł d jest liściem to dopisujemy go z przodu listy l | |||
//l jest zmienną globalną dla procedury Lista | |||
'''begin''' | '''begin''' | ||
'''if''' d <> nil '''then''' | '''if''' d <> nil '''then''' | ||
Linia 114: | Linia 116: | ||
</div> | </div> | ||
</div>}} | </div>}} | ||
==Zadanie 5 (Szerokość drzewa)== | ==Zadanie 5 (Szerokość drzewa)== | ||
Linia 126: | Linia 127: | ||
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''function''' Szerokość(d: drzewo): integer; | '''function''' Szerokość(d: drzewo): integer; | ||
'''var''' l, pom: lista | //Oblicza maksymalną liczbę wierzchołków na jednym poziomie drzewa d | ||
'''procedure''' Obejdź(d: drzewo; l:lista); | '''var''' l, pom: lista; | ||
// | maks: integer; | ||
'''procedure''' Obejdź(d: drzewo; var l:lista); | |||
//Wskaźnik l odpowiada poziomowi na którym jest d; jeśli l = nil to trzeba listę poziomów wydłużyć | |||
'''begin''' | '''begin''' | ||
'''if''' d <> nil '''then''' | |||
'''if''' | '''if''' (d^.lsyn <> nil) '''or''' (d^.psyn = nil) '''then''' '''begin''' //jeśli d to lisć | ||
'''if''' l = nil '''then''' '''begin''' | |||
new(l); | |||
l^.w:=0; | |||
l^.nast:=nil; | |||
'''end'''; | |||
l^.w:=l^.w+1; //zwiększamy licznik liści na tym poziomie | |||
'''end''' | |||
'''else''' '''begin''' //jesli d nie jest liściem | |||
Obejdź(d^.lsyn, l^.nast); //obchodzimy lewe i prawe poddrzewa | |||
Obejdź(d^.psyn, l^.nast); | |||
'''end'''; | |||
'''end'''; | '''end'''; | ||
'''begin''' // | '''begin''' //Szerokość | ||
l:=nil; | |||
Obejdź(d, l); | |||
maks:=0; //szukamy maksimum na l i jednocześnie ją niszczymy | |||
'''while''' l <> nil '''do''' '''begin''' | |||
maks:=max(maks, l^.w); | |||
pom:=l; | |||
l:=l^.nast; | |||
dispose(pom); | |||
'''end'''; | '''end'''; | ||
Szerokość:=maks; | |||
'''end'''; | '''end'''; | ||
Linia 162: | Linia 165: | ||
</div> | </div> | ||
</div>}} | </div>}} | ||
==Zadanie 6 (Średnica drzewa)== | ==Zadanie 6 (Średnica drzewa)== | ||
Linia 169: | Linia 170: | ||
{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
Niech d to wierzchołek średnicy położony najbliżej korzenia. Wtedy średnica składa się z najdłuższej ścieżki w lewym i w prawym poddrzewie d. | |||
</div> | </div> | ||
</div>}} | </div>}} | ||
Linia 175: | Linia 176: | ||
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''function''' Średnica(d: drzewo): integer; | '''function''' Średnica(d: drzewo): integer; | ||
//Obliczamy maksymalną odległość między dwoma wierzchołkami w d | |||
'''var''' dl, maks: integer; | '''var''' dl, maks: integer; | ||
'''function''' Ścieżki(d:drzewo; var dl, maks:integer); | '''function''' Ścieżki(d:drzewo; var dl, maks:integer); | ||
//Na dl i maks są | //Na dl i maks są obliczane odpowiednio długość najdłuższej ścieżki w d i maksymalna średnica w d | ||
//Dla d = nil ustalamy dl na -1 żeby dobrze obliczać dl dla liści | |||
'''var''' dl1,dl2,m1,m2, pom: integer; | '''var''' dl1,dl2,m1,m2, pom: integer; | ||
'''begin''' | '''begin''' | ||
Linia 202: | Linia 205: | ||
</div> | </div> | ||
</div>}} | </div>}} | ||
==Zadanie 7 (Sprawdzanie czy drzewo jest BST)== | ==Zadanie 7 (Sprawdzanie czy drzewo jest BST)== | ||
Linia 208: | Linia 210: | ||
{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
Sprawdzenie, że w każdym wierzchołku d^.lsyn^.w < d^.w < d^.psyn^.w nie wystarcza. Trzeba dla każdego poddrzewa wiedzieć jaka jest maksymalna i minimalna wartość | Sprawdzenie, że w każdym wierzchołku d^.lsyn^.w < d^.w < d^.psyn^.w nie wystarcza. Trzeba dla każdego poddrzewa wiedzieć jaka jest maksymalna i minimalna wartość w tym poddrzewie. | ||
</div> | </div> | ||
</div>}} | </div>}} | ||
Linia 214: | Linia 216: | ||
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''function''' CzyBST1(d: drzewo): boolean; | '''function''' CzyBST1(d: drzewo): boolean; | ||
//Sprawdzamy czy d jest drzewem BST | |||
'''var''' mala, duza: integer; | '''var''' mala, duza: integer; | ||
'''function''' Czy(d: drzewo; var mala,duza :integer): boolean; | '''function''' Czy(d: drzewo; var mala,duza :integer): boolean; | ||
Linia 232: | Linia 235: | ||
mala:=d^.w; | mala:=d^.w; | ||
'''end'''; | '''end'''; | ||
'''if''' d^.psyn <> nil '''then''' '''begin''' | '''if''' d^.psyn <> nil '''then''' '''begin''' //analogiczne sprawdzenie prawego poddrzewa | ||
c2:=Czy(d^.psyn, m2, d2); | c2:=Czy(d^.psyn, m2, d2); | ||
'''if''' c2 '''then''' '''begin''' | '''if''' c2 '''then''' '''begin''' | ||
Linia 265: | Linia 268: | ||
{{rozwiazanie| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''function''' CzyBST2(d: drzewo): boolean; | '''function''' CzyBST2(d: drzewo): boolean; | ||
//Sprawdzamy czy d jest drzewem BST | |||
'''var''' ost: integer; | '''var''' ost: integer; | ||
pierwsza, dobrze: boolean; | |||
'''procedure''' Obejdź(d: drzewo): | '''procedure''' Obejdź(d: drzewo): | ||
//Obejdź obchodzi d infiksowo; w | //Obejdź obchodzi d infiksowo; jeśli d jest liściem to porównuje d^.w z wartością z poprzedniego liścia | ||
// dobrze oznacza że dotychczas odwiedzone liście tworzą ciąg rosnący | //która mamy zapamiętaną w zmiennej globalnej ost | ||
//Wyjątkiem jest sytuacja gdy pierwsza=true, czyli gdy nie mamy jeszcze zapamiętanej żadnej wartości | |||
//dobrze oznacza że dotychczas odwiedzone liście tworzą ciąg rosnący | |||
'''begin''' | '''begin''' | ||
'''if''' dobrze '''and''' d <> nil '''then''' | '''if''' dobrze '''and''' d <> nil '''then''' |
Wersja z 21:41, 14 sie 2006
To są zadania na drzewa. Przyjmujemy następujące definicje:
type el_drzewa = record w: integer; lsyn, psyn: ^el_drzewa; end; drzewo = ^el_drzewa;
Zadanie 1 (Liczba liści w drzewie)
Napisz funkcję która oblicza liczbę liści w drzewie.
Rozwiązanie 1
Zadanie 2 (Odbicie lustrzane)
Napisz procedurę przekształcającą zadane drzewo w jego odbicie lustrzane.
Rozwiązanie 1
Zadanie 3 (Izomorfizm drzew)
Napisz funkcję sprawdzającą czy dwa zadane drzewa są izomorficzne (mają taki sam kształt).
Rozwiązanie 1
Zadanie 4 (Lista liści)
Napisz funkcję wiążącą liście drzewa w listę (od lewej do prawej). Wynikiem funkcji ma być wskaźnik do utworzonej listy. Zakładamy, że każdy węzeł ma dodatkowe pole będące wskaźnikiem do węzła, czyli używamy typów
type węzeł = record w: integer; lsyn, psyn, nast: ^węzeł; end; drzewoL = ^węzeł;
Wskazówka 1
Rozwiązanie 1
Zadanie 5 (Szerokość drzewa)
Napisz funkcję obliczającą szerokość drzewa, czyli maksymalną liczbę wierzchołków na jednym poziomie.
Wskazówka 1
Rozwiązanie 1
Zadanie 6 (Średnica drzewa)
Napisz funkcję obliczającą średnicę drzewa. Średnica to maksymalna odległość między dwoma wierzchołkami.
Wskazówka 1
Rozwiązanie 1
Zadanie 7 (Sprawdzanie czy drzewo jest BST)
Napisz funkcję sprawdzającą czy drzewo jest drzewem BST.
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2