Metody programowania / Ćwiczenia 3: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
 
(Nie pokazano 7 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 43: Linia 43:
==Zadanie 2 (Odbicie lustrzane)==
==Zadanie 2 (Odbicie lustrzane)==
Napisz procedurę przekształcającą zadane drzewo w jego odbicie lustrzane.
Napisz procedurę przekształcającą zadane drzewo w jego odbicie lustrzane.
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">
  '''procedure''' Lustro(d: drzewo);
  '''procedure''' Lustro(d: drzewo);
  //Przekształcamy d na swoje odbicie lustrzane
  //Przekształcamy d na swoje odbicie lustrzane
Linia 64: Linia 65:


</div>
</div>
</div>}}
</div>


==Zadanie 3 (Izomorfizm drzew)==
==Zadanie 3 (Izomorfizm drzew)==
Napisz funkcję sprawdzającą czy dwa zadane drzewa są izomorficzne (mają taki sam kształt).
Napisz funkcję sprawdzającą czy dwa zadane drzewa są izomorficzne (mają taki sam kształt).
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<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
  //Sprawdzamy czy d1 i d2 mają taki sam kształt
Linia 91: Linia 93:


</div>
</div>
</div>}}
</div>


==Zadanie 4 (Lista liści)==
==Zadanie 4 (Lista liści)==
Linia 100: Linia 102:
               end;
               end;
     drzewoL = ^węzeł;
     drzewoL = ^węzeł;
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span>
<div class="mw-collapsible-content" style="display:none">
Najwygodniej zrobić to obchodząc drzewo od prawej strony w lewo.
Najwygodniej zrobić to obchodząc drzewo od prawej strony w lewo.
</div>
</div>
</div>}}
</div>


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">
  '''function''' ListaLiści(d: drzewoL): drzewoL;
  '''function''' ListaLiści(d: drzewoL): drzewoL;
  //Wynikiem funkcji jest wskaźnik do listy liści (od prawej do lewej) w drzewie d
  //Wynikiem funkcji jest wskaźnik do listy liści (od prawej do lewej) w drzewie d
Linia 137: Linia 142:


</div>
</div>
</div>}}
</div>


==Zadanie 5 (Szerokość drzewa)==
==Zadanie 5 (Szerokość drzewa)==
Napisz funkcję obliczającą szerokość drzewa, czyli maksymalną liczbę wierzchołków na jednym poziomie.
Napisz funkcję obliczającą szerokość drzewa, czyli maksymalną liczbę wierzchołków na jednym poziomie.
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span>
<div class="mw-collapsible-content" style="display:none">
Najłatwiej to zrobić obchodząc drzewo wszerz; ale taniej jest gdy dla każdego poziomu będziemy pamiętać dotychczas odwiedzoną liczbę wierzchołków na tym poziomie. Do tego celu potrzebna jest lista.
Najłatwiej to zrobić obchodząc drzewo wszerz; ale taniej jest gdy dla każdego poziomu będziemy pamiętać dotychczas odwiedzoną liczbę wierzchołków na tym poziomie. Do tego celu potrzebna jest lista.
</div>
</div>
</div>}}
</div>
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">
  '''function''' Szerokość(d: drzewo): integer;
  '''function''' Szerokość(d: drzewo): integer;
  //Oblicza maksymalną liczbę wierzchołków na jednym poziomie drzewa d
  //Oblicza maksymalną liczbę wierzchołków na jednym poziomie drzewa d
Linia 182: Linia 189:
''Koszt pamięciowy:'' liniowy ze względu na wysokość drzewa  
''Koszt pamięciowy:'' liniowy ze względu na wysokość drzewa  
</div>
</div>
</div>}}
</div>


==Zadanie 6 (Średnica drzewa)==
==Zadanie 6 (Średnica drzewa)==
Napisz funkcję obliczającą średnicę drzewa. Średnica to maksymalna odległość między dwoma wierzchołkami.
Napisz funkcję obliczającą średnicę drzewa. Średnica to maksymalna odległość między dwoma wierzchołkami.


{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span>
<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.
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>


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<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
  //Obliczamy maksymalną odległość między dwoma wierzchołkami w d
Linia 222: Linia 233:
''Koszt pamięciowy:'' liniowy ze względu na wysokość drzewa (rekurencja)
''Koszt pamięciowy:'' liniowy ze względu na wysokość drzewa (rekurencja)
</div>
</div>
</div>}}
</div>


==Zadanie 7 (Sprawdzanie czy drzewo jest BST)==
==Zadanie 7 (Sprawdzanie czy drzewo jest BST)==
Napisz funkcję sprawdzającą czy drzewo jest [[drzewem BST]].
Napisz funkcję sprawdzającą czy drzewo jest [[drzewem BST]].


{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span>
<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ść w tym poddrzewie.
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>


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span>
<div class="mw-collapsible-content" style="display:none">
  '''function''' CzyBST1(d: drzewo): boolean;
  '''function''' CzyBST1(d: drzewo): boolean;
  //Sprawdzamy czy d jest drzewem BST
  //Sprawdzamy czy d jest drzewem BST
Linia 276: Linia 291:
''Koszt pamięciowy:'' liniowy ze względu na wysokość drzewa  
''Koszt pamięciowy:'' liniowy ze względu na wysokość drzewa  
</div>
</div>
</div>}}
</div>




{{wskazowka| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span>
<div class="mw-collapsible-content" style="display:none">
Można też  skorzystać z następującej własności drzew BST: w obiegu infiksowym wartości tworzą ciąg rosnący.
Można też  skorzystać z następującej własności drzew BST: w obiegu infiksowym wartości tworzą ciąg rosnący.
</div>
</div>
</div>}}
</div>


{{rozwiazanie| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span>
<div class="mw-collapsible-content" style="display:none">
  '''function''' CzyBST2(d: drzewo): boolean;
  '''function''' CzyBST2(d: drzewo): boolean;
  //Sprawdzamy czy d jest drzewem BST
  //Sprawdzamy czy d jest drzewem BST
Linia 320: Linia 339:
''Koszt pamięciowy:'' liniowy ze względu na wysokość drzewa  
''Koszt pamięciowy:'' liniowy ze względu na wysokość drzewa  
</div>
</div>
</div>}}
</div>

Aktualna wersja na dzień 21:58, 28 maj 2020

To są zadania na drzewa.

Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__

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

Zadanie 2 (Odbicie lustrzane)

Napisz procedurę przekształcającą zadane drzewo w jego odbicie lustrzane.

Rozwiązanie

Zadanie 3 (Izomorfizm drzew)

Napisz funkcję sprawdzającą czy dwa zadane drzewa są izomorficzne (mają taki sam kształt).

Rozwiązanie

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

Rozwiązanie

Zadanie 5 (Szerokość drzewa)

Napisz funkcję obliczającą szerokość drzewa, czyli maksymalną liczbę wierzchołków na jednym poziomie.

Wskazówka

Rozwiązanie

Zadanie 6 (Średnica drzewa)

Napisz funkcję obliczającą średnicę drzewa. Średnica to maksymalna odległość między dwoma wierzchołkami.

Wskazówka

Rozwiązanie

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