algorytmy i struktury danych. - wozna · algorytmy i struktury danych. drzewa poszukiwan...
TRANSCRIPT
Algorytmy i Struktury Danych.Drzewa poszukiwan binarnych.
Bozena [email protected]
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