Algorytmy i Struktury Danych. - Wozna · Algorytmy i Struktury Danych. Drzewa poszukiwan...

Post on 28-Feb-2021

30 views 3 download

Transcript of Algorytmy i Struktury Danych. - Wozna · Algorytmy i Struktury Danych. Drzewa poszukiwan...

Algorytmy i Struktury Danych.Drzewa poszukiwan binarnych.

Bozena Wozna-Szczesniakbwozna@gmail.com

Jan Długosz University, Poland

Wykład 10

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 1 / 47

Plan wykładu

Drzewiaste struktury danychDlaczego ich potrzebujemyPodstawowe definicjeDynamiczne realizacje

Drzewa poszukiwan binarnych (BST)DefinicjaOdwiedzanie wierzchołkówWyszukiwanie danego elementu, wyszukiwanie maksimum iminimumWstawianie nowego elementu do drzewaUsuwanie elementu z drzewa

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 2 / 47

Wstawianie i wyszukiwanie kluczy

Tablice nieposortowane

Tablice posortowane

Drzewa poszukiwan binarnych

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 3 / 47

Tablice nieposortowane

Operacja wstawiania na koniec – Złozonosc O(1)

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 4 / 47

Tablice nieposortowane

Operacja wstawiania na koniec – Złozonosc O(1)

Operacja wstawiania na poczatek – Złozonosc O(n)

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 4 / 47

Tablice nieposortowane

Operacja wstawiania na koniec – Złozonosc O(1)

Operacja wstawiania na poczatek – Złozonosc O(n)

Operacja wyszukiwania elementu (wyszukiwanie liniowe) –Złozonosc O(n)

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 4 / 47

Tablice nieposortowane

Operacja wstawiania na koniec – Złozonosc O(1)

Operacja wstawiania na poczatek – Złozonosc O(n)

Operacja wyszukiwania elementu (wyszukiwanie liniowe) –Złozonosc O(n)

A moze jest cos lepszego ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 4 / 47

Tablice posortowane

Operacja wstawiania –równowazne sortowaniu przezwstawianie, złozonosc O(n2).

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 5 / 47

Tablice posortowane

Operacja wstawiania –równowazne sortowaniu przezwstawianie, złozonosc O(n2).

Operacja wyszukiwaniaelementu (wyszukiwaniebinarne) – ZłozonoscO(log(n))

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 5 / 47

Tablice posortowane

Operacja wstawiania –równowazne sortowaniu przezwstawianie, złozonosc O(n2).

Operacja wyszukiwaniaelementu (wyszukiwaniebinarne) – ZłozonoscO(log(n))

Algorytm bisekcji (Tab,n,x):1: i := 0; j := n − 1;2: while (j − i > 1) do3: m := (i + j)div2;4: if Tab[m] ≤ x then5: i := m;6: else7: j := m;8: end if9: end while

10: if Tab[i] = x then11: return true;12: else13: return false;14: end if

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 5 / 47

Tablice posortowane

Operacja wstawiania –równowazne sortowaniu przezwstawianie, złozonosc O(n2).

Operacja wyszukiwaniaelementu (wyszukiwaniebinarne) – ZłozonoscO(log(n))

Potrzebujemy czegoslepszego ...

Algorytm bisekcji (Tab,n,x):1: i := 0; j := n − 1;2: while (j − i > 1) do3: m := (i + j)div2;4: if Tab[m] ≤ x then5: i := m;6: else7: j := m;8: end if9: end while

10: if Tab[i] = x then11: return true;12: else13: return false;14: end if

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 5 / 47

Drzewa

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47

Drzewa

Drzewa poszukiwan binarnych(BST)

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47

Drzewa

Drzewa poszukiwan binarnych(BST)

Kopce

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47

Drzewa

Drzewa poszukiwan binarnych(BST)

Kopce

Drzewa AVL - nazwa AVLpochodzi od nazwiskrosyjskich matematyków:Gieorgij Adelson-Wielskij iJewgienij Łandis

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47

Drzewa

Drzewa poszukiwan binarnych(BST)

Kopce

Drzewa AVL - nazwa AVLpochodzi od nazwiskrosyjskich matematyków:Gieorgij Adelson-Wielskij iJewgienij Łandis

Drzewa Czerwono-Czarne

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47

Drzewa

Drzewa poszukiwan binarnych(BST)

Kopce

Drzewa AVL - nazwa AVLpochodzi od nazwiskrosyjskich matematyków:Gieorgij Adelson-Wielskij iJewgienij Łandis

Drzewa Czerwono-Czarne

B-drzewa

...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47

Drzewa

DefinicjaDrzewem nazywamy spójny i acykliczny graf nieskierowany.

Graf jest spójny, gdy dowolne dwa wierzchołki sa połaczonedroga.

Graf jest acykliczny, jesli nie posiada cyklu.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 7 / 47

Drzewa

DefinicjaDrzewem nazywamy spójny i acykliczny graf nieskierowany.

Graf jest spójny, gdy dowolne dwa wierzchołki sa połaczonedroga.

Graf jest acykliczny, jesli nie posiada cyklu.

Drzewo, w którym wyrózniony jest jeden, charakterystycznywierzchołek nazywamy drzewem z korzeniem .Korze n jest jedynym elementem drzewa, który nie posiadapoprzednika (rodzica). Dla kazdego innego wierzchołka okreslonyjest dokładnie jeden rodzic.Wierzchołki znajdujace sie bezposrednio pod danym wezłemnazywamy synami (lub dzie cmi) .Wierzchołki, które nie maja potomków nazywane sa li scmi .Jezeli liczba nastepników dla kazdego wierzchołka wynosi conajwyzej dwa, to takie drzewo nazywamy binarnym.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 7 / 47

Drzewa

Zupełne drzewo binarne - Kazdy wezeł, z wyjatkiem lisci, madokładnie dwa nastepniki;

Drzewo poszukiwa n binarnych (BST) - Dla kazdego wezła (niebedacego lisciem) wszystkie wartosci przechowywane w lewympoddrzewie sa mniejsze od wartosci tego wezła, natomiastwszystkie wartosci przechowywane w prawym poddrzewie sawieksze od wartosci w tym wezle.

Kopiec (sterta) - Wartosci przechowywane w nastepnikachkazdego wezła sa mniejsze od wartosci w danym wezle (tzw.kopiec maksymalny) lub wartosci przechowywane w nastepnikachkazdego wezła sa wieksze od wartosci w danym wezle (tzw.kopiec minimalny). Drzewo jest szczelnie wypełniane(zrównowazone) od lewego poddrzewa

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 8 / 47

Zupełne drzewo binarne

1

2

4 5

3

6 7

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 9 / 47

Drzewo poszukiwan binarnych

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 10 / 47

Drzewo poszukiwan binarnych

2

NIL 3

NILL 4

NILL 5

NILL 6

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 11 / 47

Drzewo poszukiwan binarnych

2

NIL 3

NILL 4

NILL 5

NILL 6

2

1 3

NILL 4

NILL 5

NILL 6

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 11 / 47

Drzewo binarne, ale nie poszukiwan binarnych

2

NIL 3

NILL 0

NILL 5

NILL 6

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 12 / 47

Drzewo binarne, ale nie poszukiwan binarnych

2

NIL 3

NILL 0

NILL 5

NILL 6

2

10 3

NILL 4

NILL 5

NILL 6

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 12 / 47

Kopiec (sterta)

1

2

4

9 10

3

6 NIL

5

7 8

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 13 / 47

Drzewa

Dla kazdego drzewa mozna okreslic:

głeboko sc wierzchołka u - liczba wierzchołków, przez którenalezy przejsc od korzenia do wierzchołka u.

wysoko sc u - maksymalna liczba wierzchołków na drodze od udo pewnego liscia.

wysoko sc drzewa = głeboko sc = wysoko sc korzenia +1

sciezka z u do v- zbiór wierzchołków, przez które nalezy przejscz wierzchołka u do v .

droga = sciezka skierowana .

stopie n wierzchołka - liczba jego bezposrednich nastepników.

Stopie n drzewa - maksymalny stopien wierzchołka.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 14 / 47

Drzewa

Drzewo AVL (1962 - Adelson-Velskii, Landis) - Drzewo BST jestdrzewem AVL wtedy, kiedy dla kazdego wierzchołka wysokoscidwóch jego poddrzew róznia sie o co najwyzej jeden poziom;Drzewo Czerwono-Czarne -

Sa to drzewa poszukiwan binarnychKazdy wezeł jest czerwony lub czarnyKorzen jest czarnyCzerwony wezeł ma zawsze czarnego ojcaIlosc czarnych wezłów na dowolnej sciezce od korzenia do lisciajest taka sama

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 15 / 47

Drzewo AVL

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 16 / 47

Drzewo Czerwono-Czarne

11

2

1 7

5 8

14

NIL 15

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 17 / 47

Podstawowe operacje na strukturach drzewiastych

Przechodzenie po drzewie - metoda wszerz (BFS), metoda w głab(DFS)

Wyszukanie elementu w drzewie

Dodawanie nowego elementu do drzewa

Usuniecie wskazanego elementu z drzewa

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 18 / 47

Algorytm przechodzenia po drzewie binarnym

Cel:jednokrotne “odwiedzenie” kazdego elementu drzewa;linearyzacja drzewa;

Dane wej sciowe: dowiazanie do korzenia drzewa “Root”;Uwagi:

kolejnosc przejscia dowolna - liczba mozliwych sciezek w drzewie on wezłach wynosi n! (permutacja);najczesciej stosowane sposoby przegladania: wszerz i w głab;

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 19 / 47

Metody przechodzenia po drzewie binarnym: BFS(wszerz)

Przechodzenie wszerz polegana odwiedzaniu kolejnokazdego wezła odnajwyzszego (najnizszego)poziomu i przechodzeniukolejno po tych poziomach odgóry w dół (od dołu do góry) iod lewej do prawej lub odprawej do lewej.

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 20 / 47

Metody przechodzenia po drzewie binarnym: BFS(wszerz)

Przechodzenie wszerz polegana odwiedzaniu kolejnokazdego wezła odnajwyzszego (najnizszego)poziomu i przechodzeniukolejno po tych poziomach odgóry w dół (od dołu do góry) iod lewej do prawej lub odprawej do lewej.

Wynik: 15, 7, 30, 4, 13, 25, 34,2, 27.

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 20 / 47

Metody przechodzenia po drzewie binarnym: BFS(wszerz)

Przechodzenie wszerz polegana odwiedzaniu kolejnokazdego wezła odnajwyzszego (najnizszego)poziomu i przechodzeniukolejno po tych poziomach odgóry w dół (od dołu do góry) iod lewej do prawej lub odprawej do lewej.

Wynik: 15, 7, 30, 4, 13, 25, 34,2, 27.

Wynik: 27, 2, 34, 25, 13, 4, 30,7, 15.

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 20 / 47

BFS - algorytm

Niech wezeł pewnego drzewa binarnego bedzie postaci:

typedef struct NODE {Typ data; // dane elementarnestruct NODE * left; // dowiazanie do lewego potomkastruct NODE * right; //dowiazanie do prawgo potomka

} Node;

Algorytm BFS(root):1: enqueuq(q, root); //q jest kolejka2: while not empty(q) do3: v := first(q); print(v .data); dequeuq(q);4: if not empty(v .left) then5: enqueuq(q, v .left);6: end if7: if not empty(v .right) then8: enqueuq(q, v .right);9: end if

10: end whileBozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 21 / 47

Metody przechodzenia po drzewie binarnym: DFS (wgłab)

Wersja “inorder” - LVR (porzadek symetryczny)Przejscie do lewego poddrzewa (L);Odwiedzenie wezła (V);Przejscie do prawego poddrzewa (R);

Wersja “preorder” - VLR (porzadek prosty)Odwiedzenie wezła (V);Przejscie do lewego poddrzewa (L);Przejscie do prawego poddrzewa (R);

Wersja “postorder” - LRV (porzadek odwrotny)Przejscie do lewego poddrzewa (L);Przejscie do prawego poddrzewa (R);Odwiedzenie wezła (V);

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 22 / 47

DFS - przykład

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 23 / 47

DFS - przykład

Inorder: 2, 4, 7, 13, 15, 25, 27,30, 34 .

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 23 / 47

DFS - przykład

Inorder: 2, 4, 7, 13, 15, 25, 27,30, 34 .

Preorder: 15, 7, 4, 2, 13, 30,25, 27, 34.

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 23 / 47

DFS - przykład

Inorder: 2, 4, 7, 13, 15, 25, 27,30, 34 .

Preorder: 15, 7, 4, 2, 13, 30,25, 27, 34.

Postorder: 2, 4, 13, 7, 27, 25,34, 30, 15.

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 23 / 47

DFS - przykład

+

+

a *

b c

*

+

*

d e

f

g

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 24 / 47

DFS - przykład

Inorder: a+b*c + (d*e+f)*g .

+

+

a *

b c

*

+

*

d e

f

g

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 24 / 47

DFS - przykład

Inorder: a+b*c + (d*e+f)*g .

Postorder: abc*+de*f+g*+.

+

+

a *

b c

*

+

*

d e

f

g

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 24 / 47

void preOrder(Node const* root);

void preOrder(const Node * localRoot){

if (localRoot != NULL) {printf("%ld ", localRoot->data);preOrder(localRoot->left);preOrder(localRoot->right);

}}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 25 / 47

void inOrder(Node const* root);

void inOrder(const Node * localRoot){

if (localRoot != NULL) {inOrder(localRoot->left);printf("%ld ", localRoot->data);inOrder(localRoot->right);

}}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 26 / 47

void postOrder(Node const* root);

void postOrder(const Node * localRoot){

if (localRoot != NULL) {postOrder(localRoot->left);postOrder(localRoot->right);printf("%ld ", localRoot->data);

}}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 27 / 47

Nierekurencyjny DFS - algorytm preOrder

Niech wezeł pewnego drzewa binarnego bedzie postaci:

typedef struct NODE {Typ data; // dane elementarnestruct NODE * left; // dowiazanie do lewego potomkastruct NODE * right; //dowiazanie do prawgo potomka

} Node;

Algorytm preOrder(root):1: push(q, root); //q jest stosem2: while not empty(q) do3: v := top(q); print(v .data); pop(q);4: if not empty(v .left) then5: push(q, v .left);6: end if7: if not empty(v .right) then8: push(q, v .right);9: end if

10: end whileBozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 28 / 47

Nierekurencyjny DFS - algorytm inOrder,implementacja w C

void IterativeInOrder(Node const * localRoot){Stack globalStack;initStack(&globalStack);while (true){

while(localRoot!=NULL){push(&globalStack, (Node * )localRoot);localRoot=localRoot->left;

}if (stackEmpty(&globalStack)) return;localRoot = (Node * ) top(&globalStack);printf("%ld ", localRoot->data);pop(&globalStack);localRoot=localRoot->right;

}}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 29 / 47

Nierekurencyjny DFS - algorytm postOrder,implementacja w C

void IterativePostOrder(Node const * localRoot){Stack globalStack; Node * v;initStack(&globalStack);while(!(stackEmpty(&globalStack))||(localRoot!=NULL )){

while(localRoot!=NULL){v = (Node * )localRoot;v->visit = false;push(&globalStack, v);localRoot = localRoot->left;

}v = (Node * )top(&globalStack);pop(&globalStack);if (!(v->visit)) {

v->visit = true;push(&globalStack, v);localRoot = v->right;

} else {printf("%ld ", v->data); localRoot=NULL;

}}

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 30 / 47

Operacja wyszukiwania elementu w BST

Cel:uzyskanie dowiazania do wezła;mozna je interpretowac jako identyfikacje wezła;

Dane wej sciowe:dowiazanie do korzenia drzewa “Root”;Kryterium poszukiwania, np. wartosc danej elementarnej;

Uwagi:kolejnosc przeszukiwania dowolna - w skrajnym przypadku nalezyprzejrzec wszystkie wezły w drzewie (złozonosc O(n));stosowane rozwiazania: petla lub rekurencja;

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 31 / 47

Algorytm wyszukiwania elementu w BST

Niech wezeł pewnego drzewa binarnego bedzie postaci:

typedef struct NODE {Typ data; // dane elementarnestruct NODE * left; // dowiazanie do lewego potomkastruct NODE * right; //dowiazanie do prawgo potomka

} Node;

Algorytm find(root, value):1: while node! = NIL do2: if Value == node.data then3: return node;4: else if Value < node.data then5: node = node.left;6: else if Value > node.data then7: node = node.right;8: end if9: end while

10: return NIL;Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 32 / 47

Algorytm wyszukiwania elementu w BST - przykładposzukiwanie klucza 3

Korzen 6, Klucz < 6, Idz na lewo,

Wierzchołek 2, Klucz > 2, Idz naprawo,

Wierzchołek 4, Klucz < 4, Idz nalewo,

Wierzchołek 3, Klucz == 3. Stop

Czasy operacji: Porównanie: O(1)Poszukiwanie klucza: O(głebokosc),jesli klucz jest O(wysokosc drzewa),jesli klucza nie maZłozono sc czasowa: O(wysokoscdrzewa)

6

2

1 4

3 NIL

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 33 / 47

Node* find (int Value, Node* node) – wersja iteracyjna

Node* find (int Value, Node * node) {while (node) {

if (Value == node->data) return node;else {

if (Value < node->data) node = node->left;else

if (Value > node->data) node = node->right;}

}//end whilereturn NULL;

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 34 / 47

Node* find (int Value, Node* node) – wersjarekurencyjna

Node* find (int Value, Node * node) {if (node) {

if (Value == node->data) return node;else

if (Value < node->data)return find (Value, node->left);

else if (Value > node->data)return find (Value, node->right);

} else return NULL;}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 35 / 47

BST - wyszukiwanie elementu maksymalnego iminimalnego

Jezeli chcemy znalezc elementminimalny (maksymalny) wdrzewie to poruszamy siemaksymalnie w lewo (prawo). 15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 36 / 47

BST - wyszukiwanie elementu maksymalnego iminimalnego

Jezeli chcemy znalezc elementminimalny (maksymalny) wdrzewie to poruszamy siemaksymalnie w lewo (prawo).

Na rysunku obok niebieska drogato poszukiwanie minimum,czerwona - maksimum.

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 36 / 47

BST - wyszukiwanie elementu maksymalnego iminimalnego

Jezeli chcemy znalezc elementminimalny (maksymalny) wdrzewie to poruszamy siemaksymalnie w lewo (prawo).

Na rysunku obok niebieska drogato poszukiwanie minimum,czerwona - maksimum.

Specyficzne rozmieszczenieelementów w drzewie sprawia, zeelement minimalny znajduje siezawsze w najbardziej“wysunietym na lewo” wezle, aelement maksymalny wnajbardziej “wysunietym naprawo” wezle drzewa.

15

7

4

2 NIL

13

30

25

NIL 27

34

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 36 / 47

Wstawienie nowego elementu do BST

Cel: dodanie nowego elementu do drzewa;Dane wej sciowe:

Dowiazanie do korzenia drzewa ‘Root’;Nowe dane elementarne;

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 37 / 47

Wstawienie nowego elementu do BST - idea

Utwórz element i ustal dane elementarne;Znajdz miejsce wstawienia elementu w drzewie:

Aby znalezc miejsce na nowy element w drzewie BST, topoczawszy od korzenia nalezy porównywac nowy element zwezłem i jezeli jest on mniejszy od wartosci przechowywanej w tymwezle to poruszac sie w lewo po drzewie, w przeciwnym wypadkuporuszac sie w prawo.Wedrujemy tak długo, az dojdziemy do miejsca, w którymnapotkany wskaznik do potomka w wezle bedzie wskazywał naNULL.

Wstaw nowy wezeł w wskazane miejsce, a wspomniany wyzejwskaznik ustaw tak, aby wskazywał na nowy wezeł.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 38 / 47

void Insert (int Value, Node**next) - wersjarekurencyjna

void Insert (int Value, Node * * next) {if ( * next == NULL ) {

* next = (Node * )malloc(sizeof(Node));( * next)->left = NULL;

( * next)->right = NULL;( * next)->data = Value;

}else if (Value < ( * next)->data )

Insert( Value, ( * next)->left ) ;else if (Value > ( * next)->data )

Insert(Value, ( * next)->right );}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 39 / 47

Wstawienie nowego elementu do BST - idea

Wierzchołek 6, Klucz < 6, Idz nalewo,

Wierzchołek 2, Klucz > 2, Idz naprawo,

Wierzchołek 4, Klucz > 4, Idzprawo,

NULL, Wstaw 5.

Złozonosc czasowa: O(wysoko scdrzewa)

6

2

1 4

3 5

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 40 / 47

void insert(Node** tree, int data)

void insert(Node ** tree, int data) {Node* newNode = malloc(sizeof(Node));newNode->data = data;newNode->left = newNode->right = NULL;if ( * tree == NULL) * tree = newNode;else {

Node* curr = * tree; // zaczynamy poszukiwania od korzeniaNode* parent;while(true) {

parent = curr;if (data < curr->data) {

curr = curr->left;if (curr == NULL) {parent->left = newNode; return;}

} else {curr = curr->right;if (curr == NULL) {parent->right = newNode; return;}}

} // while}//else

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 41 / 47

Usuwanie danego elementu do BST - idea

Cel: Usuniecie wezła z drzewa;Dane wej sciowe:

Dowiazanie do korzenia drzewa ‘Root’;Opis elementu usuwanego, np. wartosc danej elementarnej;

Uwagi:Przypadek 1: wezeł jest lisciem;Przypadek 2: wezeł ma jednego potomka;Przypadek 3: wezeł ma dwóch potomków;

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 42 / 47

Przypadek 1: wezeł jest lisciem;

Usuwany wezeł nie mapotomstwa, np. wezeł 5.

Jest to najprostsza sytuacja.Nalezy usunac ten element(zwolnic pamiec) i zadbac o to,aby jego rodzic wskazywał naNULL.

Złozonosc czasowa:O(wysoko sc drzewa)

6

2

1 4

3 5

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 43 / 47

Przypadek 2: wezeł ma jednego potomka;

Usuwany wezeł posiada jednegopotomka, np. 8

Nalezy tutaj zadbac (opróczzwolnienia pamieci) o to, abyrodzic usuwanego elementuwskazywał teraz zamiast nausuwany element, na jegopotomka .

Złozonosc czasowa:O(wysoko sc drzewa)

6

2

1 4

3 5

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 44 / 47

Przypadek 3: wezeł ma dwóch potomków;

Aby usunac taki wezełposiadajacy dwóch potomków,nalezy zamienic wartosc z tegowezła z wartoscia minimalna wprawym poddrzewie usuwanegowezła lub z wartosciamaksymalna w lewympoddrzewie. Nastepnie, usuwamyelement minimalny w prawympoddrzewie, ewentualniemaksymalny w lewympoddrzewie.

Po takiej zamianie elementminimalny (maksymalny) niebedzie miał potomstwa lub conajwyzej bedzie miał jedynieprawego (lewego) syna.

Złozonosc czasowa:O(wysoko sc drzewa)

Usuwany wezeł: 6

6

2

1 4

3 5

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 45 / 47

Usuwany wezeł: 6

Usuwany wezeł: 6

6

2

1 4

3 5

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 46 / 47

Usuwany wezeł: 6

Usuwany wezeł: 6

6

2

1 4

3 5

8

7 NIL

Najpierw szukamy elementumaksymalnego w lewympoddrzewie. Jest nim 5.

6

2

1 4

3 5

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 46 / 47

Usuwany wezeł: 6

Nastepnie zamieniamy usuwanyelement (6) ze znalezionym.elementem maksymalnym wlewym poddrzewie (5).

6->5

2

1 4

3 5->6

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 47 / 47

Usuwany wezeł: 6

Nastepnie zamieniamy usuwanyelement (6) ze znalezionym.elementem maksymalnym wlewym poddrzewie (5).

6->5

2

1 4

3 5->6

8

7 NIL

Usuwamy wezeł, który zawierałelement maksymalny (5) w lewympoddrzewie. Teraz wezeł tenzawiera wartosc 6.

5

2

1 4

3 6

8

7 NIL

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 10 47 / 47