7a. Teoria drzew - kodowanie i dekodowanie

Podobne dokumenty
Matematyka dyskretna - 7.Drzewa

Grafy (3): drzewa. Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków. UTP Bydgoszcz

7. Teoria drzew - spinanie i przeszukiwanie

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Metody Kompilacji Wykład 3

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

0-0000, , , itd

Wysokość drzewa Głębokość węzła

Instrukcje dla zawodników

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Listy, kolejki, stosy

Odwrotna Notacja Polska

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Drzewa. Jeżeli graf G jest lasem, który ma n wierzchołków i k składowych, to G ma n k krawędzi. Własności drzew

3. Macierze i Układy Równań Liniowych

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

Drzewa podstawowe poj

Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste.

5c. Sieci i przepływy

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

Metoda Tablic Semantycznych

Typy danych. 2. Dane liczbowe 2.1. Liczby całkowite ze znakiem i bez znaku: 32768, -165, ; 2.2. Liczby rzeczywiste stało i zmienno pozycyjne:

Porządek symetryczny: right(x)

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Wykład 8. Drzewa AVL i 2-3-4

Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych

Def. Kod jednoznacznie definiowalny Def. Kod przedrostkowy Def. Kod optymalny. Przykłady kodów. Kody optymalne

dr inż. Paweł Myszkowski Wykład nr 11 ( )

2. Układy równań liniowych

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

Temat: Algorytm kompresji plików metodą Huffmana

Algorytmiczna teoria grafów

Algorytmy i Struktury Danych

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Sortowanie - wybrane algorytmy

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Ogólne wiadomości o drzewach

Matematyka dyskretna. Andrzej Łachwa, UJ, /10

Wykład 6. Drzewa poszukiwań binarnych (BST)

Wstęp do programowania

Podstawy Informatyki. Wykład 6. Struktury danych

5. Całka nieoznaczona

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

Nierówność Krafta-McMillana, Kodowanie Huffmana

Lista 0. Kamil Matuszewski 1 marca 2016

Kompresja bezstratna. Entropia. Kod Huffmana

TEORETYCZNE PODSTAWY INFORMATYKI

wagi cyfry pozycje

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Drzewo binarne BST. LABORKA Piotr Ciskowski

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

ALGORYTMY I STRUKTURY DANYCH

Drzewa poszukiwań binarnych

6. Całka nieoznaczona

Systemy liczbowe używane w technice komputerowej

Matematyka dyskretna

6a. Grafy eulerowskie i hamiltonowskie

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

Teoretyczne podstawy informatyki

8. Funkcje wielu zmiennych - pochodne cząstkowe

ALGORYTMY I STRUKTURY DANYCH

13. Równania różniczkowe - portrety fazowe

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

UNIWERSYTET GDAŃSKI MATERIAŁY DYDAKTYCZNE DO PRZEDMIOTU MATEMATYKA DYSKRETNA. pod redakcją: Hanna Furmańczyk Karol Horodecki Paweł Żyliński

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Niech x 1,..., x n będzie ciągiem zdarzeń. ---

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

Analiza semantyczna. Gramatyka atrybutywna

Rekurencja. Przykład. Rozważmy ciąg

Matematyka dyskretna dla informatyków

Wykłady z Matematyki Dyskretnej

Wykład 2. Drzewa poszukiwań binarnych (BST)

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

LOGIKA I TEORIA ZBIORÓW

Algorytmy i Struktury Danych

KODY SYMBOLI. Kod Shannona-Fano. Algorytm S-F. Przykład S-F

Metody teorii gier. ALP520 - Wykład z Algorytmów Probabilistycznych p.2

Lista liniowa dwukierunkowa

Spacery losowe generowanie realizacji procesu losowego

Zadanie 1. Potęgi (14 pkt)

3a. Wstęp: Elementarne równania i nierówności

1. Synteza automatów Moore a i Mealy realizujących zadane przekształcenie 2. Transformacja automatu Moore a w automat Mealy i odwrotnie

Wstęp Statyczne kody Huffmana Dynamiczne kody Huffmana Praktyka. Kodowanie Huffmana. Dawid Duda. 4 marca 2004

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

2a. Przeciętna stopa zwrotu

Kody splotowe. Zastosowanie

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

3.Funkcje elementarne - przypomnienie

Ogólne wiadomości o grafach

Problemy Decyzyjne dla Systemów Nieskończonych

ALGORYTMY I STRUKTURY DANYCH

Podstawy Informatyki. Metody dostępu do danych

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Łyżwy - omówienie zadania

ZALICZENIE WYKŁADU: 30.I.2019

1 Automaty niedeterministyczne

Transkrypt:

7a. Teoria drzew - kodowanie i dekodowanie Grzegorz Kosiorowski Uniwersytet Ekonomiczny w Krakowie zima 2016/2017 rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 1 / 74

1 Kodowanie drzew 2 Dekodowanie drzew rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 2 / 74

Drzewo uporządkowane Choć drzewo poszukiwań binarnych jest bardzo praktyczne, gdy chcemy, by program miał szybki dostęp do opartej na nim bazy danych, to w praktyce nie zawsze takie bazy danych się tworzy (np. typowa struktura katalogów zazwyczaj nie ma dokładnie 2 podkatalogów każdego katalogu). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 3 / 74

Drzewo uporządkowane Choć drzewo poszukiwań binarnych jest bardzo praktyczne, gdy chcemy, by program miał szybki dostęp do opartej na nim bazy danych, to w praktyce nie zawsze takie bazy danych się tworzy (np. typowa struktura katalogów zazwyczaj nie ma dokładnie 2 podkatalogów każdego katalogu). Dlatego taką definicję warto uogólnić: Drzewo uporządkowane Jeśli dla każdego węzła drzewa z wyróżnionym korzeniem jego dzieci są uporządkowane tj. wiemy które z nich występuje wcześniej, a które później w jakimś ustalonym porządku, to mówimy, że drzewo jest uporządkowane. Na rysunku, tak uporządkowane dzieci rysujemy od strony lewej do prawej. Kolejność dzieci u i v zapisujemy u < v, nawet jeśli nie są one liczbami. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 3 / 74

Drzewo uporządkowane - uwagi rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 4 / 74

Drzewo uporządkowane - uwagi Przykładowym porządkiem nieliczbowym ustawiania dzieci w kolejności może być porządek alfabetyczny. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 4 / 74

Drzewo uporządkowane - uwagi Przykładowym porządkiem nieliczbowym ustawiania dzieci w kolejności może być porządek alfabetyczny. W szczególności, drzewo poszukiwań binarnych było uporządkowane - lewe dziecko poprzedzało prawe. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 4 / 74

Drzewo uporządkowane - uwagi Przykładowym porządkiem nieliczbowym ustawiania dzieci w kolejności może być porządek alfabetyczny. W szczególności, drzewo poszukiwań binarnych było uporządkowane - lewe dziecko poprzedzało prawe. Powstaje teraz pytanie: skoro to jest najbardziej popularna i wygodna struktura danych, jak zapisać ją w pamięci komputera (i potem zdekodować)? W końcu komputer przechowuje w pamięci ciągi symboli, a nie jakieś rysunki. Temu zagadnieniu będzie poświęcona reszta wykładu. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 4 / 74

Drzewo uporządkowane - uwagi Przykładowym porządkiem nieliczbowym ustawiania dzieci w kolejności może być porządek alfabetyczny. W szczególności, drzewo poszukiwań binarnych było uporządkowane - lewe dziecko poprzedzało prawe. Powstaje teraz pytanie: skoro to jest najbardziej popularna i wygodna struktura danych, jak zapisać ją w pamięci komputera (i potem zdekodować)? W końcu komputer przechowuje w pamięci ciągi symboli, a nie jakieś rysunki. Temu zagadnieniu będzie poświęcona reszta wykładu. Od tego momentu, o wszystkich drzewach, które się pojawią, zakładamy, że są uporządkowane. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 4 / 74

Algorytmy przechodzenia drzewa Algorytmy przechodzenia drzewa Algorytm przechodzenia drzewa to algorytm, który ustawia w ciąg wszystkie wierzchołki skończonego uporządkowanego drzewa z wyróżnionym korzeniem według pewnej reguły. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 5 / 74

Algorytmy przechodzenia drzewa Algorytmy przechodzenia drzewa Algorytm przechodzenia drzewa to algorytm, który ustawia w ciąg wszystkie wierzchołki skończonego uporządkowanego drzewa z wyróżnionym korzeniem według pewnej reguły. Trzy najbardziej popularne takie algorytmy to PREORDER, POSTORDER i INORDER (przy czym ten trzeci działa tylko dla drzew binarnych), ustawiające wierzchołki w porządkach odpowiednio prefiksowym, postfiksowym i infiksowym. Są to algorytmy rekurencyjne. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 5 / 74

Porządek prefiksowy Porządek prefiksowy Porządek prefiksowy drzewa z wyróżnionym korzeniem to takie uporządkowanie wierzchołków, w którym korzeń drzewa umieszczamy na początku listy, a dalej znajdują się poddrzewa uporządkowane w kolejności swoich korzeni (rysunkowo: kolejność od lewej do prawej). Innymi słowy, dzieci w tym porządku pojawiają się po rodzicach. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 6 / 74

Porządek prefiksowy Porządek prefiksowy Porządek prefiksowy drzewa z wyróżnionym korzeniem to takie uporządkowanie wierzchołków, w którym korzeń drzewa umieszczamy na początku listy, a dalej znajdują się poddrzewa uporządkowane w kolejności swoich korzeni (rysunkowo: kolejność od lewej do prawej). Innymi słowy, dzieci w tym porządku pojawiają się po rodzicach. Tworzy się go algorytmem PREORDER. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 6 / 74

Algorytm PREORDER PREORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 7 / 74

Algorytm PREORDER PREORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. I. Umieść v na liście L(v). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 7 / 74

Algorytm PREORDER PREORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. I. Umieść v na liście L(v). II. Dla każdego w - dziecka v (idąc od lewej do prawej) wykonaj: PREORDER(w) {otrzymujemy w ten sposób listę L(w) złożoną z wierzchołka w i jego potomków}, a następnie dołącz otrzymaną listę L(w) na końcu listy L(v). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 7 / 74

Algorytm PREORDER PREORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. I. Umieść v na liście L(v). II. Dla każdego w - dziecka v (idąc od lewej do prawej) wykonaj: PREORDER(w) {otrzymujemy w ten sposób listę L(w) złożoną z wierzchołka w i jego potomków}, a następnie dołącz otrzymaną listę L(w) na końcu listy L(v). Rezultat: L(v) - lista wierzchołków drzewa, na której rodzice znajdują się zawsze przed swoimi dziećmi (czyli w porządku prefiksowym). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 7 / 74

PREORDER - przykład Spróbujemy algorytmem PREORDER prefiksowo uporządkować powyższe drzewo. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 8 / 74

PREORDER - przykład Spróbujemy algorytmem PREORDER prefiksowo uporządkować powyższe drzewo. Warto zauważyć, że komenda PREORDER(x) oznacza w przekładzie na ludzki: uporządkuj prefiksowo x i jego potomków. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 8 / 74

PREORDER - przykład Zaczynamy od PREORDER(A), czyli umieszczamy A na początku (i jednocześnie końcu) listy (pojawi się w lewym górnym rogu) i wykonujemy PREORDER(B) (a jak skończymy, PREORDER(C)). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 9 / 74

PREORDER - przykład By wykonać PREORDER(B), umieszczamy B na końcu listy i wykonujemy PREORDER(D) (a jak skończymy, PREORDER(E)). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 10 / 74

PREORDER - przykład By wykonać PREORDER(D), umieszczamy D na końcu listy i wykonujemy PREORDER(F ) (bo to jedyne dziecko D). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 11 / 74

PREORDER - przykład By wykonać PREORDER(F ), umieszczamy F na końcu listy. Nie robimy nic więcej, bo F nie ma dzieci. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 12 / 74

PREORDER - przykład By wykonać PREORDER(F ), umieszczamy F na końcu listy. Nie robimy nic więcej, bo F nie ma dzieci. Skoro tak, zakończyliśmy też PREORDER(D) i możemy przejść do PREORDER(E). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 12 / 74

PREORDER - przykład By wykonać PREORDER(E), umieszczamy E na końcu listy i wykonujemy kolejno PREORDER(G), PREORDER(H) i PREORDER (I ). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 13 / 74

PREORDER - przykład By wykonać PREORDER(E), umieszczamy E na końcu listy i wykonujemy kolejno PREORDER(G), PREORDER(H) i PREORDER (I ). Jako, że G, H i I są liśćmi (nie mają dzieci), wykonanie tych trzech ostatnich procedur spowoduje jedynie dopisanie GHI na końcu listy. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 13 / 74

PREORDER - przykład By wykonać PREORDER(E), umieszczamy E na końcu listy i wykonujemy kolejno PREORDER(G), PREORDER(H) i PREORDER (I ). Jako, że G, H i I są liśćmi (nie mają dzieci), wykonanie tych trzech ostatnich procedur spowoduje jedynie dopisanie GHI na końcu listy. W ten sposób ukończyliśmy PREORDER (B) i przechodzimy do zawieszonego wykonania PREORDER (C). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 13 / 74

PREORDER - przykład By wykonać PREORDER(C), umieszczamy C na końcu listy i wykonujemy kolejno PREORDER(J) rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 14 / 74

PREORDER - przykład By wykonać PREORDER(C), umieszczamy C na końcu listy i wykonujemy kolejno PREORDER(J) (który spowoduje tylko dopisanie J na końcu listy) i PREORDER (K), rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 14 / 74

PREORDER - przykład By wykonać PREORDER(C), umieszczamy C na końcu listy i wykonujemy kolejno PREORDER(J) (który spowoduje tylko dopisanie J na końcu listy) i PREORDER (K), który dopisze do listy kolejno wierzchołki K, L, M. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 14 / 74

PREORDER - wynik i interpretacja graficzna Algorytm PREORDER prowadzi nas zatem do następującego uporządkowania wierzchołków drzewa: ABDFEGHICJKLM. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 15 / 74

PREORDER - wynik i interpretacja graficzna Algorytm PREORDER prowadzi nas zatem do następującego uporządkowania wierzchołków drzewa: ABDFEGHICJKLM. Ten ciąg łatwo można utworzyć przechodząc drzewo wzdłuż jego obwodu jak na rysunku poniżej. Startujemy od korzenia A i za każdym razem, kiedy przechodzimy koło wierzchołka, który jeszcze nie znalazł się na liście, dopisujemy ten wierzchołek na końcu listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 15 / 74

Porządek postfiksowy Porządek postfiksowy Porządek postfiksowy drzewa z wyróżnionym korzeniem to takie uporządkowanie wierzchołków, w którym poddrzewa są umieszczone najpierw (rysunkowo: kolejność od lewej do prawej), a potem dopiero korzeń. Innymi słowy, dzieci w tym porządku pojawiają się przed rodzicami. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 16 / 74

Porządek postfiksowy Porządek postfiksowy Porządek postfiksowy drzewa z wyróżnionym korzeniem to takie uporządkowanie wierzchołków, w którym poddrzewa są umieszczone najpierw (rysunkowo: kolejność od lewej do prawej), a potem dopiero korzeń. Innymi słowy, dzieci w tym porządku pojawiają się przed rodzicami. Tworzy się go algorytmem POSTORDER. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 16 / 74

Algorytm POSTORDER POSTORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 17 / 74

Algorytm POSTORDER POSTORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. I. Niech L(v) = (pusta lista). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 17 / 74

Algorytm POSTORDER POSTORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. I. Niech L(v) = (pusta lista). II. Dla każdego w - dziecka v (idąc od lewej do prawej) wykonaj: POSTORDER(w) {otrzymujemy w ten sposób listę L(w) złożoną z wierzchołka w i jego potomków}, a następnie dołącz otrzymaną listę L(w) na końcu listy L(v). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 17 / 74

Algorytm POSTORDER POSTORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. I. Niech L(v) = (pusta lista). II. Dla każdego w - dziecka v (idąc od lewej do prawej) wykonaj: POSTORDER(w) {otrzymujemy w ten sposób listę L(w) złożoną z wierzchołka w i jego potomków}, a następnie dołącz otrzymaną listę L(w) na końcu listy L(v). III. Dołącz wierzchołek v na końcu listy L(v). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 17 / 74

Algorytm POSTORDER POSTORDER(v) Dane: Skończone, uporządkowane drzewo z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, w-węzeł. I. Niech L(v) = (pusta lista). II. Dla każdego w - dziecka v (idąc od lewej do prawej) wykonaj: POSTORDER(w) {otrzymujemy w ten sposób listę L(w) złożoną z wierzchołka w i jego potomków}, a następnie dołącz otrzymaną listę L(w) na końcu listy L(v). III. Dołącz wierzchołek v na końcu listy L(v). Rezultat: L(v) - lista wierzchołków drzewa, na której rodzice znajdują się zawsze po swoich dzieciach (czyli w porządku postfiksowym). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 17 / 74

POSTORDER - przykład Spróbujemy algorytmem POSTORDER postfiksowo uporządkować powyższe drzewo. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 18 / 74

POSTORDER - przykład Spróbujemy algorytmem POSTORDER postfiksowo uporządkować powyższe drzewo. Warto zauważyć, że komenda POSTORDER(x) oznacza w przekładzie na ludzki: uporządkuj postfiksowo x i jego potomków. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 18 / 74

POSTORDER - przykład Zaczynamy od POSTORDER(A), co oznacza, że musimy wykonać POSTORDER(B), następnie POSTORDER (C) i dopiero potem dopisać A na końcu listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 19 / 74

POSTORDER - przykład Wykonujemy POSTORDER(B), co oznacza, że musimy wykonać POSTORDER(D), następnie POSTORDER (E) i dopiero potem dopisać B na końcu listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 20 / 74

POSTORDER - przykład Wykonujemy POSTORDER(D), co oznacza, że musimy wykonać POSTORDER(F ) i dopiero potem dopisać D na końcu listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 21 / 74

POSTORDER - przykład Wykonujemy POSTORDER(F ), co oznacza dopisanie rozpoczęcie listy od F. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 22 / 74

POSTORDER - przykład Wykonujemy POSTORDER(F ), co oznacza dopisanie rozpoczęcie listy od F. Skoro POSTORDER(F ) został wykonany, możemy dokończyć POSTORDER(D), czyli dopisać D na końcu listy (od tej pory lista pojawia się z lewej strony drzewa). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 22 / 74

POSTORDER - przykład Skoro POSTORDER(D) został wykonany, przechodzimy do kolejnego kroku wykonania POSTORDER(B), czyli POSTORDER(E). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 23 / 74

POSTORDER - przykład Skoro POSTORDER(D) został wykonany, przechodzimy do kolejnego kroku wykonania POSTORDER(B), czyli POSTORDER(E). Wykonujemy POSTORDER(E), co oznacza, że musimy wykonać POSTORDER(G), następnie POSTORDER (H), POSTORDER(I ) i dopiero potem dopisać E na końcu listy. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 23 / 74

POSTORDER - przykład G, H, I nie mają dzieci, więc wykonanie POSTORDER(G), POSTORDER (H) i POSTORDER(I ) sprowadza się do dopisania G, H, I na końcu listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 24 / 74

POSTORDER - przykład Skoro rozpatrzyliśmy już algorytm POSTORDER dla wszystkich dzieci E, kończymy POSTORDER(E) dopisując E na końcu listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 25 / 74

POSTORDER - przykład Skoro rozpatrzyliśmy już algorytm POSTORDER dla wszystkich dzieci B, kończymy POSTORDER(B) dopisując B na końcu listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 26 / 74

POSTORDER - przykład By kontynuować POSTORDER(A), musimy teraz wykonać POSTORDER (C). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 27 / 74

POSTORDER - przykład By kontynuować POSTORDER(A), musimy teraz wykonać POSTORDER (C). Nie będziemy już tego poddrzewa analizować szczegółowo: analogicznie do POSTORDER(B) do końca listy dopiszemy: rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 27 / 74

POSTORDER - przykład By kontynuować POSTORDER(A), musimy teraz wykonać POSTORDER (C). Nie będziemy już tego poddrzewa analizować szczegółowo: analogicznie do POSTORDER(B) do końca listy dopiszemy: JLMKC. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 27 / 74

POSTORDER - przykład Skoro rozpatrzyliśmy już algorytm POSTORDER dla wszystkich dzieci A, kończymy POSTORDER(A) dopisując A na końcu listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 28 / 74

POSTORDER - wynik i interpretacja graficzna Algorytm POSTORDER prowadzi nas zatem do następującego uporządkowania wierzchołków drzewa: FDGHIEBJLMKCA. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 29 / 74

POSTORDER - wynik i interpretacja graficzna Algorytm POSTORDER prowadzi nas zatem do następującego uporządkowania wierzchołków drzewa: FDGHIEBJLMKCA. Ten ciąg łatwo można utworzyć przechodząc drzewo wzdłuż jego obwodu jak na rysunku poniżej. Startujemy od korzenia A i za każdym razem, kiedy przechodzimy koło wierzchołka, który jeszcze nie znalazł się na liście, dopisujemy ten wierzchołek NA POCZĄTKU listy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 29 / 74

Porządek infiksowy Trzeci sposób przechodzenia drzewa dotyczy tylko uporządkowanych drzew binarnych z wyróżnionym korzeniem. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 30 / 74

Porządek infiksowy Trzeci sposób przechodzenia drzewa dotyczy tylko uporządkowanych drzew binarnych z wyróżnionym korzeniem. Porządek infiksowy Porządek infiksowy drzewa binarnego z wyróżnionym korzeniem to takie uporządkowanie wierzchołków, w którym dany korzeń jest umieszczony pomiędzy wierzchołkami poddrzewa, którego korzeniem jest jego lewe dziecko, a wierzchołkami poddrzewa, którego korzeniem jest jego prawe dziecko. Innymi słowy, lewe dzieci w tym porządku pojawiają się przed rodzicami, a prawe po nich. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 30 / 74

Porządek infiksowy Trzeci sposób przechodzenia drzewa dotyczy tylko uporządkowanych drzew binarnych z wyróżnionym korzeniem. Porządek infiksowy Porządek infiksowy drzewa binarnego z wyróżnionym korzeniem to takie uporządkowanie wierzchołków, w którym dany korzeń jest umieszczony pomiędzy wierzchołkami poddrzewa, którego korzeniem jest jego lewe dziecko, a wierzchołkami poddrzewa, którego korzeniem jest jego prawe dziecko. Innymi słowy, lewe dzieci w tym porządku pojawiają się przed rodzicami, a prawe po nich. Tworzy się go algorytmem INORDER. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 30 / 74

Algorytm INORDER - część 1 INORDER(v) Dane: Skończone, uporządkowane drzewo binarne z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, u, w-węzły. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 31 / 74

Algorytm INORDER - część 1 INORDER(v) Dane: Skończone, uporządkowane drzewo binarne z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, u, w-węzły. I. Niech L(v) = (pusta lista). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 31 / 74

Algorytm INORDER - część 1 INORDER(v) Dane: Skończone, uporządkowane drzewo binarne z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, u, w-węzły. I. Niech L(v) = (pusta lista). II. Jeśli wierzchołek v ma lewe dziecko w, wykonaj: INORDER(w) {otrzymujemy w ten sposób listę L(w) złożoną z wierzchołka w i jego potomków}, a następnie dołącz otrzymaną listę L(w) na końcu listy L(v). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 31 / 74

Algorytm INORDER - część 1 INORDER(v) Dane: Skończone, uporządkowane drzewo binarne z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, u, w-węzły. I. Niech L(v) = (pusta lista). II. Jeśli wierzchołek v ma lewe dziecko w, wykonaj: INORDER(w) {otrzymujemy w ten sposób listę L(w) złożoną z wierzchołka w i jego potomków}, a następnie dołącz otrzymaną listę L(w) na końcu listy L(v). III. Dołącz v na koniec listy L(v). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 31 / 74

Algorytm INORDER - część 2 INORDER(v) Dane: Skończone, uporządkowane drzewo binarne z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, u, w-węzły. IV. Jeśli wierzchołek v ma prawe dziecko u, wykonaj: INORDER(u) {otrzymujemy w ten sposób listę L(u) złożoną z wierzchołka u i jego potomków}, a następnie dołącz otrzymaną listę L(u) na końcu listy L(v) Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 32 / 74

Algorytm INORDER - część 2 INORDER(v) Dane: Skończone, uporządkowane drzewo binarne z wyróżnionym korzeniem v. Zmienne: L(v) - lista wierzchołków drzewa, u, w-węzły. IV. Jeśli wierzchołek v ma prawe dziecko u, wykonaj: INORDER(u) {otrzymujemy w ten sposób listę L(u) złożoną z wierzchołka u i jego potomków}, a następnie dołącz otrzymaną listę L(u) na końcu listy L(v) Rezultat: L(v) - lista wierzchołków drzewa, na której lewe dzieci znajdują się przed rodzicami, a prawe - za nimi (czyli w porządku infiksowym). Warto zwrócić uwagę, że algorytm działa również jeśli niektórzy rodzice mają tylko jedno dziecko. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 32 / 74

INORDER - przykład Spróbujemy algorytmem INORDER infiksowo uporządkować powyższe drzewo. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 33 / 74

INORDER - przykład Spróbujemy algorytmem INORDER infiksowo uporządkować powyższe drzewo. Warto zauważyć, że komenda INORDER(x) oznacza w przekładzie na ludzki: uporządkuj infiksowo x i jego potomków. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 33 / 74

INORDER - przykład Zaczynamy od INORDER(A), co oznacza, że musimy wykonać INORDER(B), następnie dopisać A na końcu listy i dopiero potem INORDER (C). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 34 / 74

INORDER - przykład Wykonujemy INORDER(B), co oznacza, że mmusimy wykonać INORDER(D), następnie dopisać B na końcu listy i dopiero potem INORDER (E). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 35 / 74

INORDER - przykład Wykonujemy INORDER(D). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 36 / 74

INORDER - przykład Wykonujemy INORDER(D). D nie ma lewych dzieci, więc najpierw dopisujemy D na końcu listy, a potem wykonujemy INORDER(F ), Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 36 / 74

INORDER - przykład Wykonujemy INORDER(D). D nie ma lewych dzieci, więc najpierw dopisujemy D na końcu listy, a potem wykonujemy INORDER(F ), co polega na dopisaniu F na końcu listy, bo F nie ma dzieci. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 36 / 74

INORDER - przykład Kontynuujemy INORDER(B). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 37 / 74

INORDER - przykład Kontynuujemy INORDER(B). Skoro wykonaliśmy już INORDER(D), to teraz czas dopisać B na koniec listy i wykonać INORDER(E). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 37 / 74

INORDER - przykład Wykoujemy INORDER(E), co oznacza, że mmusimy wykonać INORDER(G), następnie dopisać E na końcu listy i dopiero potem INORDER (I ). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 38 / 74

INORDER - przykład Wykoujemy INORDER(E), co oznacza, że mmusimy wykonać INORDER(G), następnie dopisać E na końcu listy i dopiero potem INORDER (I ). Jako, że G i I nie mają dzieci, wykonanie INORDER(G) i INORDER(I ) sprowadza się do dopisania odpowiednio G i I na końcu listy. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 38 / 74

INORDER - przykład Wykoujemy INORDER(E), co oznacza, że mmusimy wykonać INORDER(G), następnie dopisać E na końcu listy i dopiero potem INORDER (I ). Jako, że G i I nie mają dzieci, wykonanie INORDER(G) i INORDER(I ) sprowadza się do dopisania odpowiednio G i I na końcu listy. Zatem INORDER(E) oznacza dopisanie na końcu listy: GEI. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 38 / 74

INORDER - przykład W ten sposób ukończyliśmy INORDER(B). Kolejny krok procedury INORDER(A) wymaga dopisania A na koniec listy i przejścia do wykonania INORDER(C), co zakończy cały algorytm. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 39 / 74

INORDER - przykład Wykonujemy INORDER(C). Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 40 / 74

INORDER - przykład Wykonujemy INORDER(C). Nie będziemy analizować tego szczegółowo. Analogicznie do poprzednich kroków, wynikiem INORDER(C) jest dopisanie na koniec listy: JCLKM. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 40 / 74

INORDER - wynik i interpretacja graficzna Algorytm INORDER prowadzi nas zatem do następującego uporządkowania wierzchołków drzewa: DFBGEIAJCLKM. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 41 / 74

INORDER - wynik i interpretacja graficzna Algorytm INORDER prowadzi nas zatem do następującego uporządkowania wierzchołków drzewa: DFBGEIAJCLKM. Ten ciąg można utworzyć przerysowując drzewo tak, by każdy kolejny poziom drzewa miał coraz krótsze krawędzie, by lewi potomkowie zawsze byli na lewo od przodka, a prawi potomkowie na prawo. Następnie wystarczy odczytać wierzchołki od lewej do prawej, ignorując ich wysokość. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 41 / 74

Algorytmy przechodzenia drzewa - uwagi rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 42 / 74

Algorytmy przechodzenia drzewa - uwagi Czas działania wszystkich trzech algorytmów przechodzenia drzewa to O( V ), gdzie V jest zbiorem wierzchołków drzewa. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 42 / 74

Algorytmy przechodzenia drzewa - uwagi Czas działania wszystkich trzech algorytmów przechodzenia drzewa to O( V ), gdzie V jest zbiorem wierzchołków drzewa. Z pewnych, za chwilę objaśnionych względów, algorytmy PREORDER i POSTORDER o wiele lepiej nadają się do komputerowego przechowywania danych niż INORDER. Jednak INORDER jest często stosowany w niekomputerowych zapisach (notacje algebraiczne). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 42 / 74

Dekodowanie drzew - wstęp Wiemy już, jak można zakodować drzewo z wyróżnionym korzeniem. Jednak, czy z odkodowaniem pójdzie tak łatwo? Czy możemy odtworzyć drzewo mając daną tylko kolejność wierzchołków i sposób zakodowania (prefiksowy, postfiksowy, infiksowy)? Na ogół odpowiedź jest przecząca. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 43 / 74

Dekodowanie PREORDER - przykład Wszystkie powyższe drzewa mają porządek prefiksowy ABCDE. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 44 / 74

Dekodowanie POSTORDER - przykład Wszystkie powyższe drzewa mają porządek postfiksowy ABCDE. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 45 / 74

Dekodowanie INORDER - przykład Wszystkie powyższe drzewa mają porządek infiksowy ABCDE. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 46 / 74

Dekodowanie INORDER - przykład Wszystkie powyższe drzewa mają porządek infiksowy ABCDE. Jaki zatem sens ma kodowanie drzewa, jeśli z postaci zakodowanej nie potrafimy tego drzewa odtworzyć? Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 46 / 74

Twierdzenie o dekodowaniu drzew Otóż, odtworzenie jest możliwe, pod warunkiem, że mamy dodatkowe dane, które musimy sobie zapewnić podczas kodowania. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 47 / 74

Twierdzenie o dekodowaniu drzew Otóż, odtworzenie jest możliwe, pod warunkiem, że mamy dodatkowe dane, które musimy sobie zapewnić podczas kodowania. Twierdzenie o dekodowaniu drzew Niech T będzie skończonym, uporządkowanym drzewem z wyróżnionym korzeniem, którego wierzchołki są wypisane w porządku prefiksowym lub postfiksowym. Załóżmy, że znana jest liczba dzieci każdego wierzchołka. Wtedy to drzewo jest wyznaczone jednoznacznie i może być odtworzone z ciągu wierzchołków. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 47 / 74

Twierdzenie o dekodowaniu drzew Otóż, odtworzenie jest możliwe, pod warunkiem, że mamy dodatkowe dane, które musimy sobie zapewnić podczas kodowania. Twierdzenie o dekodowaniu drzew Niech T będzie skończonym, uporządkowanym drzewem z wyróżnionym korzeniem, którego wierzchołki są wypisane w porządku prefiksowym lub postfiksowym. Załóżmy, że znana jest liczba dzieci każdego wierzchołka. Wtedy to drzewo jest wyznaczone jednoznacznie i może być odtworzone z ciągu wierzchołków. Niestety, nie da się uzyskać takiego wyniku dla porządku infiksowego dlatego jest on mniej używany w komputerowych strukturach danych. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 47 / 74

Twierdzenie o dekodowaniu drzew Otóż, odtworzenie jest możliwe, pod warunkiem, że mamy dodatkowe dane, które musimy sobie zapewnić podczas kodowania. Twierdzenie o dekodowaniu drzew Niech T będzie skończonym, uporządkowanym drzewem z wyróżnionym korzeniem, którego wierzchołki są wypisane w porządku prefiksowym lub postfiksowym. Załóżmy, że znana jest liczba dzieci każdego wierzchołka. Wtedy to drzewo jest wyznaczone jednoznacznie i może być odtworzone z ciągu wierzchołków. Niestety, nie da się uzyskać takiego wyniku dla porządku infiksowego dlatego jest on mniej używany w komputerowych strukturach danych. Natomiast dla porządków pre- i post-fiksowych, twierdzenie to jest konstruktywne, tj. pozwala na algorytmiczną konstrukcję zakodowanego drzewa, co wkrótce zobaczymy. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 47 / 74

Dekodowanie porządku infiksowego - kontrprzykład Dwa powyższe grafy nie tylko są kodowane w porządku infiksowym przez ABCDE, ale też ciąg dzieci każdego z wierzchołków w obydwu przypadkach można zapisać jako (0, 2, 0, 2, 0) (czyli 0 dzieci węzła A, 2 dzieci węzła B itd.). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 48 / 74

Dekodowanie porządku infiksowego - kontrprzykład Dwa powyższe grafy nie tylko są kodowane w porządku infiksowym przez ABCDE, ale też ciąg dzieci każdego z wierzchołków w obydwu przypadkach można zapisać jako (0, 2, 0, 2, 0) (czyli 0 dzieci węzła A, 2 dzieci węzła B itd.). Stąd wynika, że mając dany taki kod drzewa w porządku infiksowym i liczbę dzieci każdego węzła, nie jesteśmy w stanie odgadnąć, które z drzew reprezentuje podany kod. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 48 / 74

Dekodowanie porządku infiksowego - kontrprzykład Dwa powyższe grafy nie tylko są kodowane w porządku infiksowym przez ABCDE, ale też ciąg dzieci każdego z wierzchołków w obydwu przypadkach można zapisać jako (0, 2, 0, 2, 0) (czyli 0 dzieci węzła A, 2 dzieci węzła B itd.). Stąd wynika, że mając dany taki kod drzewa w porządku infiksowym i liczbę dzieci każdego węzła, nie jesteśmy w stanie odgadnąć, które z drzew reprezentuje podany kod. Dlatego twierdzenie o dekodowaniu drzew dla porządku infiksowego byłoby nieprawdziwe. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 48 / 74

Algorytm DEPRE Poniżej algorytm odzyskiwania drzewa z jego porządku prefiksowego (z zadaną liczbą dzieci każdego węzła). DEPRE(v 1,... v n, c 1,... c n ) Dane: v 1,... v n - ciąg wierzchołków drzewa T w porządku prefiksowym, c 1,... c n - ciąg liczb dzieci tych wierzchołków. Zmienne: i, j - liczniki pętli wierzchołków. S(v i ) - zbiory wierzchołków, U(v i ) - liczby całkowite. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 49 / 74

Algorytm DEPRE Poniżej algorytm odzyskiwania drzewa z jego porządku prefiksowego (z zadaną liczbą dzieci każdego węzła). DEPRE(v 1,... v n, c 1,... c n ) Dane: v 1,... v n - ciąg wierzchołków drzewa T w porządku prefiksowym, c 1,... c n - ciąg liczb dzieci tych wierzchołków. Zmienne: i, j - liczniki pętli wierzchołków. S(v i ) - zbiory wierzchołków, U(v i ) - liczby całkowite. I. Dla każdego i podstawiamy U(v i ) := c i, S(v i ) =. Następnie i := 2. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 49 / 74

Algorytm DEPRE Poniżej algorytm odzyskiwania drzewa z jego porządku prefiksowego (z zadaną liczbą dzieci każdego węzła). DEPRE(v 1,... v n, c 1,... c n ) Dane: v 1,... v n - ciąg wierzchołków drzewa T w porządku prefiksowym, c 1,... c n - ciąg liczb dzieci tych wierzchołków. Zmienne: i, j - liczniki pętli wierzchołków. S(v i ) - zbiory wierzchołków, U(v i ) - liczby całkowite. I. Dla każdego i podstawiamy U(v i ) := c i, S(v i ) =. Następnie i := 2. II. Dopóki i n wykonujemy: Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 49 / 74

Algorytm DEPRE Poniżej algorytm odzyskiwania drzewa z jego porządku prefiksowego (z zadaną liczbą dzieci każdego węzła). DEPRE(v 1,... v n, c 1,... c n ) Dane: v 1,... v n - ciąg wierzchołków drzewa T w porządku prefiksowym, c 1,... c n - ciąg liczb dzieci tych wierzchołków. Zmienne: i, j - liczniki pętli wierzchołków. S(v i ) - zbiory wierzchołków, U(v i ) - liczby całkowite. I. Dla każdego i podstawiamy U(v i ) := c i, S(v i ) =. Następnie i := 2. II. Dopóki i n wykonujemy: Znajdujemy maksymalne możliwe j < i, takie, że U(v j ) 0. Wtedy U(v j ) := U(v j ) 1, S(v j ) := S(v j ) {v i }, i := i + 1. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 49 / 74

Algorytm DEPRE Poniżej algorytm odzyskiwania drzewa z jego porządku prefiksowego (z zadaną liczbą dzieci każdego węzła). DEPRE(v 1,... v n, c 1,... c n ) Dane: v 1,... v n - ciąg wierzchołków drzewa T w porządku prefiksowym, c 1,... c n - ciąg liczb dzieci tych wierzchołków. Zmienne: i, j - liczniki pętli wierzchołków. S(v i ) - zbiory wierzchołków, U(v i ) - liczby całkowite. I. Dla każdego i podstawiamy U(v i ) := c i, S(v i ) =. Następnie i := 2. II. Dopóki i n wykonujemy: Znajdujemy maksymalne możliwe j < i, takie, że U(v j ) 0. Wtedy U(v j ) := U(v j ) 1, S(v j ) := S(v j ) {v i }, i := i + 1. Rezultat: S(v i ) - ciąg zbiorów, zawierających wierzchołki będące dziećmi kolejnych węzłów v i. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 49 / 74

DEPRE - uwagi Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 50 / 74

DEPRE - uwagi S(v i ) to zbiór dzieci węzła v i. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 50 / 74

DEPRE - uwagi S(v i ) to zbiór dzieci węzła v i. Jeśli znamy zbiory dzieci wszystkich węzłów, to znamy też wszystkie połączenia między węzłami, więc potrafimy odtworzyć całe drzewo. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 50 / 74

DEPRE - uwagi S(v i ) to zbiór dzieci węzła v i. Jeśli znamy zbiory dzieci wszystkich węzłów, to znamy też wszystkie połączenia między węzłami, więc potrafimy odtworzyć całe drzewo. Algorytm DEPRE stworzy CO NAJWYŻEJ jedno drzewo. W szczególności, może się okazać, że dane, którymi go nakarmiliśmy nie są spełnione przez żadne drzewo. Przykładowo, żaden ciąg (c 1,... c n ) taki, że c n 0 nie może być ciągiem dzieci wierzchołków drzewa uporządkowanych prefiksowo, bo n-ty wierzchołek w tym porządku jest liściem, więc nie może mieć dzieci (które musiałyby się pojawić po swoim rodzicu) Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 50 / 74

DEPRE - uwagi S(v i ) to zbiór dzieci węzła v i. Jeśli znamy zbiory dzieci wszystkich węzłów, to znamy też wszystkie połączenia między węzłami, więc potrafimy odtworzyć całe drzewo. Algorytm DEPRE stworzy CO NAJWYŻEJ jedno drzewo. W szczególności, może się okazać, że dane, którymi go nakarmiliśmy nie są spełnione przez żadne drzewo. Przykładowo, żaden ciąg (c 1,... c n ) taki, że c n 0 nie może być ciągiem dzieci wierzchołków drzewa uporządkowanych prefiksowo, bo n-ty wierzchołek w tym porządku jest liściem, więc nie może mieć dzieci (które musiałyby się pojawić po swoim rodzicu) Podobnie, jeśli n > 1, to musi być c 1 0, bo pierwszym węzłem na liście uporządkowanej prefiksowo musi być korzeń, który musi mieć dzieci (chyba, że to jest drzewo o jednym wierzchołku). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 50 / 74

DEPRE - przykład Przeanalizujemy działanie algorytmu DEPRE na przykładzie listy wierzchołków ABDIEFJCGH i ciągu przypisanych im dzieci: (2, 3, 1, 0, 0, 1, 0, 2, 0, 0). Wyniki będziemy zapisywać w takiej tabelce: v k A B D I E F J C G H U(v k ) S(v k ) Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 51 / 74

DEPRE - przykład W pierwszym kroku, wpisujemy do tabelki c i w miejsce U(v i ), oraz w miejsce S(v i ). v k A B D I E F J C G H U(v k ) 2 3 1 0 0 1 0 2 0 0 S(v k ) Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 52 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 2 3 1 0 0 1 0 2 0 0 S(v k ) rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 53 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 2 3 1 0 0 1 0 2 0 0 S(v k ) Wierzchołek A, jako początek listy prefiksowej, jest oczywiście korzeniem drzewa, więc nie szukamy mu rodzica. Szukanie rodziców zaczynamy od wierzchołka B (i = 2). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 53 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 2 3 1 0 0 1 0 2 0 0 S(v k ) Wierzchołek A, jako początek listy prefiksowej, jest oczywiście korzeniem drzewa, więc nie szukamy mu rodzica. Szukanie rodziców zaczynamy od wierzchołka B (i = 2). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 53 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 2 3 1 0 0 1 0 2 0 0 S(v k ) Wierzchołek A, jako początek listy prefiksowej, jest oczywiście korzeniem drzewa, więc nie szukamy mu rodzica. Szukanie rodziców zaczynamy od wierzchołka B (i = 2). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim A. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 53 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 2 3 1 0 0 1 0 2 0 0 S(v k ) Wierzchołek A, jako początek listy prefiksowej, jest oczywiście korzeniem drzewa, więc nie szukamy mu rodzica. Szukanie rodziców zaczynamy od wierzchołka B (i = 2). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim A. Zatem podstawiamy U(A) := 2 1 = 1 i S(A) = {B} = {B} rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 53 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 3 1 0 0 1 0 2 0 0 S(v k ) B rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 54 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 3 1 0 0 1 0 2 0 0 S(v k ) B Przechodzimy do wierzchołka D (i = 3). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 54 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 3 1 0 0 1 0 2 0 0 S(v k ) B Przechodzimy do wierzchołka D (i = 3). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 54 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 3 1 0 0 1 0 2 0 0 S(v k ) B Przechodzimy do wierzchołka D (i = 3). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim B. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 54 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 3 1 0 0 1 0 2 0 0 S(v k ) B Przechodzimy do wierzchołka D (i = 3). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim B. Zatem podstawiamy U(B) := 3 1 = 2 i S(B) = {D} = {D} Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 54 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 1 0 0 1 0 2 0 0 S(v k ) B D rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 55 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 1 0 0 1 0 2 0 0 S(v k ) B D Przechodzimy do wierzchołka I (i = 4). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 55 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 1 0 0 1 0 2 0 0 S(v k ) B D Przechodzimy do wierzchołka I (i = 4). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 55 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 1 0 0 1 0 2 0 0 S(v k ) B D Przechodzimy do wierzchołka I (i = 4). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim D. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 55 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 1 0 0 1 0 2 0 0 S(v k ) B D Przechodzimy do wierzchołka I (i = 4). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim D. Zatem podstawiamy U(D) := 1 1 = 0 i S(D) = {I } = {I } Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 55 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 0 0 0 1 0 2 0 0 S(v k ) B D I rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 56 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 0 0 0 1 0 2 0 0 S(v k ) B D I Przechodzimy do wierzchołka E (i = 5). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 56 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 0 0 0 1 0 2 0 0 S(v k ) B D I Przechodzimy do wierzchołka E (i = 5). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 56 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 0 0 0 1 0 2 0 0 S(v k ) B D I Przechodzimy do wierzchołka E (i = 5). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim B. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 56 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 2 0 0 0 1 0 2 0 0 S(v k ) B D I Przechodzimy do wierzchołka E (i = 5). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim B. Zatem podstawiamy U(B) := 2 1 = 1 i S(B) = {D} {E} = {D, E} Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 56 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 1 0 0 0 1 0 2 0 0 S(v k ) B DE I rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 57 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 1 0 0 0 1 0 2 0 0 S(v k ) B DE I Przechodzimy do wierzchołka F (i = 6). rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 57 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 1 0 0 0 1 0 2 0 0 S(v k ) B DE I Przechodzimy do wierzchołka F (i = 6). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 57 / 74

DEPRE - przykład v k A B D I E F J C G H U(v k ) 1 1 0 0 0 1 0 2 0 0 S(v k ) B DE I Przechodzimy do wierzchołka F (i = 6). Szukamy poprzedniego wierzchołka na liście, dla którego U 0. W tym przypadku jest nim B. Grzegorz Kosiorowski (Uniwersytet Ekonomiczny 7a. wteoria Krakowie) drzew - kodowanie i dekodowanie zima 2016/2017 57 / 74