<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FAlgorytmy_i_struktury_danych%2FDrzewa</id>
	<title>TI/Algorytmy i struktury danych/Drzewa - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FAlgorytmy_i_struktury_danych%2FDrzewa"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Drzewa&amp;action=history"/>
	<updated>2026-04-24T14:05:23Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Drzewa&amp;diff=1915&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;  == Drzewa ==  Przypomnij sobie krótki wstęp do teorii grafów przedstawiony n...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Drzewa&amp;diff=1915&amp;oldid=prev"/>
		<updated>2015-05-23T13:35:33Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;  == Drzewa ==  Przypomnij sobie &lt;a href=&quot;/edu/index.php/TI/Wst%C4%99p_do_programowania_obiektowego#Kr.C3.B3tki_wst.C4.99p_do_teorii_graf.C3.B3w&quot; title=&quot;TI/Wstęp do programowania obiektowego&quot;&gt;krótki wstęp do teorii grafów&lt;/a&gt; przedstawiony n...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Drzewa ==&lt;br /&gt;
&lt;br /&gt;
Przypomnij sobie [[TI/Wstęp_do_programowania_obiektowego#Kr.C3.B3tki_wst.C4.99p_do_teorii_graf.C3.B3w|krótki wstęp do teorii grafów]] przedstawiony na początku semestru.&lt;br /&gt;
&lt;br /&gt;
Drzewo jest strukturą składającą się z węzłów i krawędzi.&lt;br /&gt;
[[Plik:przykladowe_drzewo.svg|thumb|&amp;lt;figure id=&amp;quot;fig:1&amp;quot;/&amp;gt;Przykład drzewa.]]&lt;br /&gt;
Węzłem wyróżnionym jest korzeń drzewa (na rysunku &amp;lt;xr id=&amp;quot;fig:1&amp;quot;/&amp;gt; korzeniem jest węzeł o wartości 2).&lt;br /&gt;
&lt;br /&gt;
W drzewie nie występują cykle, czyli ścieżki zaczynające się i kończące na tym samym wierzchołku bez powtórzeń krawędzi. Drzewa są też spójne, co oznacza, że między dowolną parą wierzchołków istnieje ścieżka. Stopniem wierzchołka nazywamy liczbę krawędzi z niego wychodzących. W drzewach wprowadza się następujące pojęcia:&lt;br /&gt;
* liść &amp;amp;mdash; węzeł o stopniu równym jeden, co oznacza, że liście są węzłami połączonymi tylko ze swoim rodzicem. Na rysunku &amp;lt;xr id=&amp;quot;fig:1&amp;quot;/&amp;gt; liśćmi są węzły o wartościach 9, 3, 4, 5, 11.&lt;br /&gt;
* Synowie &amp;amp;mdash; węzły połączone z danym i leżące poniżej. Na rysunku &amp;lt;xr id=&amp;quot;fig:1&amp;quot;/&amp;gt; synami są wszystkie węzły oprócz węzła o wartości 2, który jest korzeniem drzewa (ang. ''root'').&lt;br /&gt;
* Ścieżka &amp;amp;mdash; ciąg krawędzi łączących dwa wierzchołki. Od węzła 4 do węzła 5 mamy następującą ścieżkę &amp;amp;mdash; krawędź 4-8, krawędź 8-2, krawędź 2-7, krawędź 7-6, krawędź 6-5.&lt;br /&gt;
* Poziom wierzchołka &amp;amp;mdash; odległość wierzchołka od korzenia. Przykładowo wierzchołek 6 ma poziom 3.&lt;br /&gt;
* Wysokość drzewa &amp;amp;mdash; maksymalny poziom drzewa. Wysokość drzewa na rysunku &amp;lt;xr id=&amp;quot;fig:1&amp;quot;/&amp;gt; to 4.&lt;br /&gt;
* Stopień wierzchołka &amp;amp;mdash; liczba krawędzi z nim sąsiadujących. Na rysunku &amp;lt;xr id=&amp;quot;fig:1&amp;quot;/&amp;gt; węzeł o kluczu 2 ma stopień 3.&lt;br /&gt;
* Stopień drzewa &amp;amp;mdash; maksymalny stopień wierzchołka. Drzewo przedstawione na rysunku &amp;lt;xr id=&amp;quot;fig:2&amp;quot;/&amp;gt; ma stopień 2.&lt;br /&gt;
* Węzeł wewnętrzny &amp;amp;mdash; węzeł nie będący liściem &amp;amp;mdash; na rysunku &amp;lt;xr id=&amp;quot;fig:1&amp;quot;/&amp;gt; węzłami wewnętrznymi są węzły o kluczach 6,7,2, i 8.&lt;br /&gt;
drzewo można formalnie zdefiniować rekurencyjnie jako drzewo puste lub korzeń z listą drzew&lt;br /&gt;
[[Plik:przykladowe_drzewo_wycinek.svg|thumb|&amp;lt;figure id=&amp;quot;fig:2&amp;quot;/&amp;gt;Przykład drzewa.]]&lt;br /&gt;
===Drzewa binarne===&lt;br /&gt;
&lt;br /&gt;
Drzewo binarne jest drzewem, w którym stopień każdego wierzchołka (liczba połączeń danego wierzchołka) nie jest wyższy niż 3. Drzewo takie przedstawione jest na rysunku &amp;lt;xr id=&amp;quot;fig:3&amp;quot;/&amp;gt;. Drzewo takie można wygodnie reprezentować w tablicy &amp;amp;mdash; jeżeli nadamy wierzchołkowi ''i''-ty element tablicy, jego lewy syn będzie miał indeks ''2i+1'', a prawy ''2i+2'' w przypadku języków, w których wektory numerowane są od zera. &lt;br /&gt;
[[Plik:Binary_tree.svg|thumb|&amp;lt;figure id=&amp;quot;fig:3&amp;quot;/&amp;gt; Przykład drzewa binarnego]]&lt;br /&gt;
&lt;br /&gt;
Reprezentacja drzewa binarnego przedstawionego na rysunku &amp;lt;xr id=&amp;quot;fig:3&amp;quot;/&amp;gt;, postaci tablicy jest następująca: &lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!indeks&lt;br /&gt;
!klucz&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|7&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|6&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|9&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|11&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|14&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
====Zadanie====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;korzen litera=&amp;quot;d&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;lewy litera=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;lewy litera=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;/lewy&amp;gt;&lt;br /&gt;
 		&amp;lt;prawy litera=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;/prawy&amp;gt;&lt;br /&gt;
 	&amp;lt;/lewy&amp;gt;&lt;br /&gt;
 	&amp;lt;prawy litera=&amp;quot;f&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;lewy litera=&amp;quot;e&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;/lewy&amp;gt;&lt;br /&gt;
 		&amp;lt;prawy litera=&amp;quot;g&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;/prawy&amp;gt;&lt;br /&gt;
 	&amp;lt;/prawy&amp;gt;&lt;br /&gt;
 &amp;lt;/korzen&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Napisz funkcję zapisująca drzewo binarne do tablicy (albo listy) zw porządku prefiksowym (do tablicy/listy wpisz artybut/y). Przetestuj swój program na powyższym drzewie. &lt;br /&gt;
&lt;br /&gt;
W ramach zabawy spróbuj także zapisać drzewo w porządku infiksowym i postfiksowym.&lt;br /&gt;
&lt;br /&gt;
====Drzewo BST (Binary Search Tree)====&lt;br /&gt;
[http://people.ksp.sk/~kuko/bak/ Tutaj] można obejrzeć symulację działania drzewa BST, jak również różnego innego rodzaju drzewiastych struktur danych.&lt;br /&gt;
&lt;br /&gt;
Drzewo BST (wyszukiwania binarnego) ma następującą własność &amp;amp;mdash; dla każdego węzła wszystkie wartości znajdujące się w poddrzewie którego korzeniem jest jego prawy syn mają wartości większe niż on, a w poddrzewie którego korzeniem jest lewy syn mniejsze (albo na odwrót, ważna jest konsekwencja implementacji). Struktura ta jest bardzo pomocna przy wyszukiwaniu.&lt;br /&gt;
&lt;br /&gt;
Załóżmy, że chcemy znaleźć liczbę ''k''. Jeśli ''k'' ma wartość większą niż klucz korzenia to rekurencyjnie szukamy w lewym poddrzewie, jeśli mniejszą to w prawym, jeśli równą to znaleźliśmy. Algorytm ten przedstawiony jest na rys. &amp;lt;xr id=&amp;quot;fig:szukanie_BST&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Drzewo BST wypisane infixowo daje ciąg uporządkowany.&lt;br /&gt;
&amp;lt;figure id=&amp;quot;fig:init&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wezel(object):&lt;br /&gt;
    def __init__(self, klucz):&lt;br /&gt;
        self.lewySyn = None&lt;br /&gt;
        self.prawySyn = None&lt;br /&gt;
        self.klucz = klucz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;caption&amp;gt;Inicjalizowanie klasy węzeł.&amp;lt;/caption&amp;gt;&lt;br /&gt;
&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;figure id=&amp;quot;fig:sprawdz&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wezel(object):&lt;br /&gt;
    ...&lt;br /&gt;
  def sprawdz(self, klucz, rodzic=None):&lt;br /&gt;
&lt;br /&gt;
      if klucz &amp;gt; self.klucz:&lt;br /&gt;
          if self.lewySyn is None:&lt;br /&gt;
              return None, None&lt;br /&gt;
          return self.lewySyn.sprawdz(klucz, self)&lt;br /&gt;
      elif klucz &amp;lt; self.klucz:&lt;br /&gt;
          if self.prawySyn is None:&lt;br /&gt;
              return None, None&lt;br /&gt;
          return self.prawySyn.sprawdz(klucz, self)&lt;br /&gt;
      else:&lt;br /&gt;
          return self, rodzic&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;caption&amp;gt;Sprawdzenie czy wartość jest w drzewie BST.&amp;lt;/caption&amp;gt;&lt;br /&gt;
&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;figure id=&amp;quot;fig:wstaw&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wezel(object):&lt;br /&gt;
    &lt;br /&gt;
    def wstaw(self, klucz):&lt;br /&gt;
        &lt;br /&gt;
        if klucz &amp;lt; self.klucz:&lt;br /&gt;
            if self.lewySyn is None:&lt;br /&gt;
	        self.lewySyn = Wezel(klucz)&lt;br /&gt;
            else:&lt;br /&gt;
	        self.lewySyn.wstaw(klucz)&lt;br /&gt;
        else:&lt;br /&gt;
            if self.prawySyn is None:&lt;br /&gt;
	        self.prawySyn = Wezel(klucz)&lt;br /&gt;
            else:&lt;br /&gt;
	        self.prawySyn.wstaw(klucz)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;caption&amp;gt;Wstawianie do drzewa BST.&amp;lt;/caption&amp;gt;&lt;br /&gt;
&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;figure id=&amp;quot;fig:szukanie_BST&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 def przeszukaj_drzewo_binarne(wezel, klucz):&lt;br /&gt;
     if wezel is None:&lt;br /&gt;
         return None  # nie znaleziono klucza&lt;br /&gt;
     if klucz &amp;lt; wezel.klucz:&lt;br /&gt;
         return przeszukaj_drzewo_binarne(wezel.lewySyn, klucz)&lt;br /&gt;
     elif klucz &amp;gt; wezel.klucz:&lt;br /&gt;
         return przeszukaj_drzewo_binarne(wezel.prawySyn, klucz)&lt;br /&gt;
     else:  # gdy szukany klucz jest rowny kluczowi danego wezla&lt;br /&gt;
         return wezel.klucz  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;caption&amp;gt;Przeszukiwanie drzewa binarnego.&amp;lt;/caption&amp;gt;&lt;br /&gt;
&amp;lt;/figure&amp;gt;&lt;br /&gt;
=====Zadanie 1=====&lt;br /&gt;
Algorytmy i fragmenty struktur danych opisane na przedstawione na rysunkach &amp;lt;xr id=&amp;quot;fig:init&amp;quot;/&amp;gt;, &amp;lt;xr id=&amp;quot;fig:wstaw&amp;quot;/&amp;gt;, &amp;lt;xr id=&amp;quot;fig:sprawdz&amp;quot;/&amp;gt;, &amp;lt;xr id=&amp;quot;fig:szukanie_BST&amp;quot;/&amp;gt; złoż w klasę &amp;lt;tt&amp;gt;Wezel&amp;lt;/tt&amp;gt;. Sprawdź, czy wszystkie metody są poprawnie zapisane. Dopisz do klasy &amp;lt;tt&amp;gt;Wezel&amp;lt;/tt&amp;gt; metodę wypisującą drzewo.&lt;br /&gt;
=====Zadanie 2=====&lt;br /&gt;
Do klasy &amp;lt;tt&amp;gt;Wezel&amp;lt;/tt&amp;gt; dodaj metodę  wypisującą liczbę synów danego węzła.&lt;br /&gt;
&lt;br /&gt;
=====Zadanie 3=====&lt;br /&gt;
Porównanie dwóch drzew powinno zachodzić rekurencyjnie. Jeżeli natrafi na jeden różny węzeł w dwóch drzewach powinno zwracać &amp;lt;tt&amp;gt;False&amp;lt;/tt&amp;gt;. Różny węzeł może znaczyć także brakujący liść. Jak argument powinien być przekazywany korzeń drugiego drzewa. Do klasy  &amp;lt;tt&amp;gt;Wezel&amp;lt;/tt&amp;gt; dodaj taką metodę.&lt;br /&gt;
=====Usuwanie węzła w drzewie BST=====&lt;br /&gt;
Usuwanięcie węzła może wymagać reorganizacji struktury drzewa w celu zachowania własności BST. Należy rozważyć trzy przypadki&lt;br /&gt;
* usuwany węzeł nie ma synów (jest liściem): usunięcie przebiega bez reorganizacji drzewa, wskaźnik do węzła w jego ojcu zastępowany jest wskaźnikiem do węzła pustego&lt;br /&gt;
* usuwany węzeł ma jednego syna: dany węzeł usuwamy, a jego syna podstawiamy w miejsce usuniętego węzła&lt;br /&gt;
* usuwany węzeł ma dwóch synów: po jego usunięciu wstawiamy w jego miejsce węzeł, który jest jego następnikiem lub poprzednikiem (do wyboru albo implementacja z następnikiem albo z poprzednikiem). Następnik i poprzednik to odpowiednio najbardziej lewy węzeł w prawym podrzewie, lub najbardziej prawy węzeł węzeł w prawym poddrzewie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    else:&lt;br /&gt;
        rodzic = wezel&lt;br /&gt;
        nastepnik = wezel.prawySyn&lt;br /&gt;
        while nastepnik.lewySyn:&lt;br /&gt;
            rodzic = nastepnik&lt;br /&gt;
            nastepnik = nastepnik.lewySyn&lt;br /&gt;
        wezel.klucz = nastepnik.klucz&lt;br /&gt;
        if rodzic.lewySyn == nastepnik:&lt;br /&gt;
            rodzic.lewySyn = nastepnik.prawySyn&lt;br /&gt;
        else:&lt;br /&gt;
            rodzic.prawySyn = nastepnik.prawySyn&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Zadanie 4 =====&lt;br /&gt;
Dodaj do klasy metodę usuwającą węzeł o zadanym kluczy z drzewa BST.&lt;br /&gt;
===== Równoważenie drzwa (zadanie domowe)=====&lt;br /&gt;
Przeczytaj [http://www.eecs.umich.edu/~qstout/pap/CACM86.pdf artykuł] opisujący algorytm równoważenia drzewa DSW. Napisz własną implementację tego algorytmu w Pythonie, używając klasy &amp;lt;tt&amp;gt;Wezel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==obiegi drzew ==&lt;br /&gt;
&lt;br /&gt;
możliwe są następujące obiegi drzew i kolejności odwiedzania:&lt;br /&gt;
&lt;br /&gt;
* prefixowyLP - my, lewy syn, prawy syn&lt;br /&gt;
* prefixowyPL - my, prawy syn, lewy syn&lt;br /&gt;
* infixowyLP - lewy syn, my, prawy syn&lt;br /&gt;
* infixowyPL - prawy syn, my, lewy syn&lt;br /&gt;
* postfixowyLP - lewy syn, prawy syn, my&lt;br /&gt;
* postfixowyPL - prawy syn, lewy syn, my&lt;br /&gt;
&lt;br /&gt;
obiegi te są powiązane ciekawymi twierdzeniami:&lt;br /&gt;
&lt;br /&gt;
* prefixowyLP = postfixowyPL^{-1}&lt;br /&gt;
* prefixowyPL = postfixowyLP^{-1}&lt;br /&gt;
* infoxowyLP = infixowyPL^{-1}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Materiały zostały przygotowane na postawie m.in. [http://www.laurentluce.com/?p=166 Binary Search Tree library na blogu Laurenta Luce'a]&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>