Algorytmy i Struktury Danych. - Drzewa poszukiwan binarnych.

advertisement
Algorytmy i Struktury Danych.
Drzewa poszukiwań binarnych.
Bożena Woźna-Szcześniak
[email protected]
Jan Długosz University, Poland
Wykład 10
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
1 / 47
Plan wykładu
Drzewiaste struktury danych
Dlaczego ich potrzebujemy
Podstawowe definicje
Dynamiczne realizacje
Drzewa poszukiwań binarnych (BST)
Definicja
Odwiedzanie wierzchołków
Wyszukiwanie danego elementu, wyszukiwanie maksimum i
minimum
Wstawianie nowego elementu do drzewa
Usuwanie elementu z drzewa
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
2 / 47
Wstawianie i wyszukiwanie kluczy
Tablice nieposortowane
Tablice posortowane
Drzewa poszukiwań binarnych
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
3 / 47
Tablice nieposortowane
Operacja wstawiania na koniec – Złożoność O(1)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
4 / 47
Tablice nieposortowane
Operacja wstawiania na koniec – Złożoność O(1)
Operacja wstawiania na poczatek
˛
– Złożoność O(n)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
4 / 47
Tablice nieposortowane
Operacja wstawiania na koniec – Złożoność O(1)
Operacja wstawiania na poczatek
˛
– Złożoność O(n)
Operacja wyszukiwania elementu (wyszukiwanie liniowe) –
Złożoność O(n)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
4 / 47
Tablice nieposortowane
Operacja wstawiania na koniec – Złożoność O(1)
Operacja wstawiania na poczatek
˛
– Złożoność O(n)
Operacja wyszukiwania elementu (wyszukiwanie liniowe) –
Złożoność O(n)
A może jest coś lepszego ...
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
4 / 47
Tablice posortowane
Operacja wstawiania –
równoważne sortowaniu przez
wstawianie, złożoność O(n2 ).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
5 / 47
Tablice posortowane
Operacja wstawiania –
równoważne sortowaniu przez
wstawianie, złożoność O(n2 ).
Operacja wyszukiwania
elementu (wyszukiwanie
binarne) – Złożoność
O(log(n))
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
5 / 47
Tablice posortowane
Algorytm bisekcji (Tab,n,x):
1: i := 0; j := n − 1;
2: while (j − i > 1) do
Operacja wstawiania –
3:
m := (i + j)div2;
równoważne sortowaniu przez 4: if Tab[m] ≤ x then
wstawianie, złożoność O(n2 ).
5:
i := m;
Operacja wyszukiwania
6:
else
elementu (wyszukiwanie
7:
j := m;
binarne) – Złożoność
8:
end if
O(log(n))
9: end while
10: if Tab[i] = x then
11:
return true;
12: else
13:
return false;
14: end if
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
5 / 47
Tablice posortowane
Algorytm bisekcji (Tab,n,x):
1: i := 0; j := n − 1;
2: while (j − i > 1) do
Operacja wstawiania –
3:
m := (i + j)div2;
równoważne sortowaniu przez 4: if Tab[m] ≤ x then
wstawianie, złożoność O(n2 ).
5:
i := m;
Operacja wyszukiwania
6:
else
elementu (wyszukiwanie
7:
j := m;
binarne) – Złożoność
8:
end if
O(log(n))
9: end while
10: if Tab[i] = x then
Potrzebujemy czegoś
11:
return true;
lepszego ...
12: else
13:
return false;
14: end if
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
5 / 47
Drzewa
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
6 / 47
Drzewa
Drzewa poszukiwań binarnych
(BST)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
6 / 47
Drzewa
Drzewa poszukiwań binarnych
(BST)
Kopce
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
6 / 47
Drzewa
Drzewa poszukiwań binarnych
(BST)
Kopce
Drzewa AVL - nazwa AVL
pochodzi od nazwisk
rosyjskich matematyków:
Gieorgij Adelson-Wielskij i
Jewgienij Łandis
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
6 / 47
Drzewa
Drzewa poszukiwań binarnych
(BST)
Kopce
Drzewa AVL - nazwa AVL
pochodzi od nazwisk
rosyjskich matematyków:
Gieorgij Adelson-Wielskij i
Jewgienij Łandis
Drzewa Czerwono-Czarne
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
6 / 47
Drzewa
Drzewa poszukiwań binarnych
(BST)
Kopce
Drzewa AVL - nazwa AVL
pochodzi od nazwisk
rosyjskich matematyków:
Gieorgij Adelson-Wielskij i
Jewgienij Łandis
Drzewa Czerwono-Czarne
B-drzewa
...
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
6 / 47
Drzewa
Definicja
Drzewem nazywamy spójny i acykliczny graf nieskierowany.
Graf jest spójny, gdy dowolne dwa wierzchołki sa˛ połaczone
˛
droga.
˛
Graf jest acykliczny, jeśli nie posiada cyklu.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
7 / 47
Drzewa
Definicja
Drzewem nazywamy spójny i acykliczny graf nieskierowany.
Graf jest spójny, gdy dowolne dwa wierzchołki sa˛ połaczone
˛
droga.
˛
Graf jest acykliczny, jeśli nie posiada cyklu.
Drzewo, w którym wyróżniony jest jeden, charakterystyczny
wierzchołek nazywamy drzewem z korzeniem.
Korzeń jest jedynym elementem drzewa, który nie posiada
poprzednika (rodzica). Dla każdego innego wierzchołka określony
jest dokładnie jeden rodzic.
Wierzchołki znajdujace
˛ sie˛ bezpośrednio pod danym wezłem
˛
nazywamy synami (lub dziećmi).
Wierzchołki, które nie maja˛ potomków nazywane sa˛ liśćmi.
Jeżeli liczba nastepników
˛
dla każdego wierzchołka wynosi co
najwyżej dwa, to takie drzewo nazywamy binarnym.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
7 / 47
Drzewa
Zupełne drzewo binarne - Każdy wezeł,
˛
z wyjatkiem
˛
liści, ma
dokładnie dwa nastepniki;
˛
Drzewo poszukiwań binarnych (BST) - Dla każdego wezła
˛
(nie
bed
˛ acego
˛
liściem) wszystkie wartości przechowywane w lewym
poddrzewie sa˛ mniejsze od wartości tego wezła,
˛
natomiast
wszystkie wartości przechowywane w prawym poddrzewie sa˛
wieksze
˛
od wartości w tym weźle.
˛
Kopiec (sterta) - Wartości przechowywane w nastepnikach
˛
każdego wezła
˛
sa˛ mniejsze od wartości w danym weźle
˛
(tzw.
kopiec maksymalny) lub wartości przechowywane w nastepnikach
˛
każdego wezła
˛
sa˛ wieksze
˛
od wartości w danym weźle
˛
(tzw.
kopiec minimalny). Drzewo jest szczelnie wypełniane
(zrównoważone) od lewego poddrzewa
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
8 / 47
Zupełne drzewo binarne
1
3
2
4
Bożena Woźna-Szcześniak (AJD)
5
6
Algorytmy i Struktury Danych.
7
Wykład 10
9 / 47
Drzewo poszukiwań binarnych
15
7
13
4
2
Bożena Woźna-Szcześniak (AJD)
30
NIL
25
NIL
Algorytmy i Struktury Danych.
34
27
Wykład 10
10 / 47
Drzewo poszukiwań binarnych
2
3
NIL
NILL
4
NILL
NILL
Bożena Woźna-Szcześniak (AJD)
5
6
Algorytmy i Struktury Danych.
Wykład 10
11 / 47
Drzewo poszukiwań binarnych
2
2
3
NIL
NILL
4
NILL
NILL
Bożena Woźna-Szcześniak (AJD)
3
1
NILL
5
4
5
NILL
6
Algorytmy i Struktury Danych.
NILL
Wykład 10
6
11 / 47
Drzewo binarne, ale nie poszukiwań binarnych
2
3
NIL
0
NILL
NILL
NILL
Bożena Woźna-Szcześniak (AJD)
5
6
Algorytmy i Struktury Danych.
Wykład 10
12 / 47
Drzewo binarne, ale nie poszukiwań binarnych
2
2
3
NIL
10
0
NILL
NILL
NILL
Bożena Woźna-Szcześniak (AJD)
3
NILL
5
4
5
NILL
6
Algorytmy i Struktury Danych.
NILL
Wykład 10
6
12 / 47
Kopiec (sterta)
1
5
2
9
7
3
4
10
Bożena Woźna-Szcześniak (AJD)
6
8
NIL
Algorytmy i Struktury Danych.
Wykład 10
13 / 47
Drzewa
Dla każdego drzewa można określić:
głeboko
˛
ść wierzchołka u - liczba wierzchołków, przez które
należy przejść od korzenia do wierzchołka u.
wysokość u - maksymalna liczba wierzchołków na drodze od u
do pewnego liścia.
wysokość drzewa = głeboko
˛
ść = wysokość korzenia +1
ścieżka z u do v- zbiór wierzchołków, przez które należy przejść
z wierzchołka u do v.
droga = ścieżka skierowana.
stopień wierzchołka - liczba jego bezpośrednich nastepników.
˛
Stopień drzewa - maksymalny stopień wierzchołka.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
14 / 47
Drzewa
Drzewo AVL (1962 - Adelson-Velskii, Landis) - Drzewo BST jest
drzewem AVL wtedy, kiedy dla każdego wierzchołka wysokości
dwóch jego poddrzew różnia˛ sie˛ o co najwyżej jeden poziom;
Drzewo Czerwono-Czarne Sa˛ to drzewa poszukiwań binarnych
Każdy w˛ezeł jest czerwony lub czarny
Korzeń jest czarny
Czerwony w˛ezeł ma zawsze czarnego ojca
Ilość czarnych w˛ezłów na dowolnej ścieżce od korzenia do liścia
jest taka sama
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
15 / 47
Drzewo AVL
15
7
13
4
2
Bożena Woźna-Szcześniak (AJD)
30
NIL
25
NIL
Algorytmy i Struktury Danych.
34
27
Wykład 10
16 / 47
Drzewo Czerwono-Czarne
11
2
14
7
1
5
Bożena Woźna-Szcześniak (AJD)
NIL
15
8
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
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
18 / 47
Algorytm przechodzenia po drzewie binarnym
Cel:
jednokrotne “odwiedzenie” każdego elementu drzewa;
linearyzacja drzewa;
Dane wejściowe: dowiazanie
˛
do korzenia drzewa “Root”;
Uwagi:
kolejność przejścia dowolna - liczba możliwych ścieżek w drzewie o
n w˛ezłach wynosi n! (permutacja);
najcześciej
˛
stosowane sposoby przegladania:
˛
wszerz i w głab;
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
19 / 47
Metody przechodzenia po drzewie binarnym: BFS
(wszerz)
Przechodzenie wszerz polega
na odwiedzaniu kolejno
każdego wezła
˛
od
najwyższego (najniższego)
poziomu i przechodzeniu
kolejno po tych poziomach od
góry w dół (od dołu do góry) i
od lewej do prawej lub od
prawej do lewej.
15
7
Bożena Woźna-Szcześniak (AJD)
13
4
2
Algorytmy i Struktury Danych.
30
NIL
25
NIL
34
27
Wykład 10
20 / 47
Metody przechodzenia po drzewie binarnym: BFS
(wszerz)
Przechodzenie wszerz polega
na odwiedzaniu kolejno
każdego wezła
˛
od
najwyższego (najniższego)
poziomu i przechodzeniu
kolejno po tych poziomach od
góry w dół (od dołu do góry) i
od lewej do prawej lub od
prawej do lewej.
15
7
30
13
4
25
34
Wynik: 15, 7, 30, 4, 13, 25, 34,
2, 27.
2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
NIL
NIL
27
Wykład 10
20 / 47
Metody przechodzenia po drzewie binarnym: BFS
(wszerz)
Przechodzenie wszerz polega
na odwiedzaniu kolejno
każdego wezła
˛
od
najwyższego (najniższego)
poziomu i przechodzeniu
kolejno po tych poziomach od
góry w dół (od dołu do góry) i
od lewej do prawej lub od
prawej do lewej.
15
7
30
13
4
25
34
Wynik: 15, 7, 30, 4, 13, 25, 34,
2, 27.
Wynik: 27, 2, 34, 25, 13, 4, 30,
7, 15.
Bożena Woźna-Szcześniak (AJD)
2
Algorytmy i Struktury Danych.
NIL
NIL
27
Wykład 10
20 / 47
BFS - algorytm
Niech w˛ezeł pewnego drzewa binarnego bedzie
˛
postaci:
typedef struct NODE {
Typ data; // dane elementarne
struct NODE *left; // dowiazanie
˛
do lewego potomka
struct NODE *right; //dowiazanie
˛
do prawgo potomka
} Node;
Algorytm BFS(root):
1: enqueuq(q, root); //q jest kolejka˛
2: while not empty (q) do
3:
v := first(q); print(v .data); dequeuq(q);
4:
if not empty (v .left) then
5:
enqueuq(q, v .left);
6:
end if
7:
if not empty (v .right) then
8:
enqueuq(q, v .right);
9:
end if
10: end while
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
21 / 47
Metody przechodzenia po drzewie binarnym: DFS (w
głab)
˛
Wersja “inorder” - LVR (porzadek
˛
symetryczny)
Przejście do lewego poddrzewa (L);
Odwiedzenie w˛ezła (V);
Przejście do prawego poddrzewa (R);
Wersja “preorder” - VLR (porzadek
˛
prosty)
Odwiedzenie w˛ezła (V);
Przejście do lewego poddrzewa (L);
Przejście do prawego poddrzewa (R);
Wersja “postorder” - LRV (porzadek
˛
odwrotny)
Przejście do lewego poddrzewa (L);
Przejście do prawego poddrzewa (R);
Odwiedzenie w˛ezła (V);
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
22 / 47
DFS - przykład
15
7
13
4
2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
30
NIL
25
NIL
34
27
Wykład 10
23 / 47
DFS - przykład
15
Inorder: 2, 4, 7, 13, 15, 25, 27,
30, 34 .
7
13
4
2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
30
NIL
25
NIL
34
27
Wykład 10
23 / 47
DFS - przykład
15
Inorder: 2, 4, 7, 13, 15, 25, 27,
30, 34 .
7
Preorder: 15, 7, 4, 2, 13, 30,
25, 27, 34.
13
4
2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
30
NIL
25
NIL
34
27
Wykład 10
23 / 47
DFS - przykład
15
Inorder: 2, 4, 7, 13, 15, 25, 27,
30, 34 .
7
Preorder: 15, 7, 4, 2, 13, 30,
25, 27, 34.
Postorder: 2, 4, 13, 7, 27, 25,
34, 30, 15.
Bożena Woźna-Szcześniak (AJD)
13
4
2
Algorytmy i Struktury Danych.
30
NIL
25
NIL
34
27
Wykład 10
23 / 47
DFS - przykład
+
+
*
a
b
c
*
d
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
g
+
*
f
e
Wykład 10
24 / 47
DFS - przykład
+
+
Inorder: a+b*c + (d*e+f)*g .
*
a
b
c
*
d
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
g
+
*
f
e
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
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
g
+
*
f
e
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);
}
}
Bożena Woźna-Szcześniak (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);
}
}
Bożena Woźna-Szcześniak (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);
}
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
27 / 47
Nierekurencyjny DFS - algorytm preOrder
Niech w˛ezeł pewnego drzewa binarnego bedzie
˛
postaci:
typedef struct NODE {
Typ data; // dane elementarne
struct NODE *left; // dowiazanie
˛
do lewego potomka
struct NODE *right; //dowiazanie
˛
do prawgo potomka
} Node;
Algorytm preOrder(root):
1: push(q, root); //q jest stosem
2: while not empty (q) do
3:
v := top(q); print(v .data); pop(q);
4:
if not empty (v .left) then
5:
push(q, v .left);
6:
end if
7:
if not empty (v .right) then
8:
push(q, v .right);
9:
end if
10: end while
Bożena Woźna-Szcześniak (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;
}
}
Bożena Woźna-Szcześniak (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;
}
}
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
30 / 47
Operacja wyszukiwania elementu w BST
Cel:
uzyskanie dowiazania
˛
do w˛ezła;
można je interpretować jako identyfikacje˛ w˛ezła;
Dane wejściowe:
dowiazanie
˛
do korzenia drzewa “Root”;
Kryterium poszukiwania, np. wartość danej elementarnej;
Uwagi:
kolejność przeszukiwania dowolna - w skrajnym przypadku należy
przejrzeć wszystkie w˛ezły w drzewie (złożoność O(n));
stosowane rozwiazania:
˛
petla
˛ lub rekurencja;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
31 / 47
Algorytm wyszukiwania elementu w BST
Niech w˛ezeł pewnego drzewa binarnego bedzie
˛
postaci:
typedef struct NODE {
Typ data; // dane elementarne
struct NODE *left; // dowiazanie
˛
do lewego potomka
struct NODE *right; //dowiazanie
˛
do prawgo potomka
} Node;
Algorytm find(root, value):
1: while node! = NIL do
2:
if Value == node.data then
3:
return node;
4:
else if Value < node.data then
5:
node = node.left;
6:
else if Value > node.data then
7:
node = node.right;
8:
end if
9: end while
10: return NIL;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
32 / 47
Algorytm wyszukiwania elementu w BST - przykład
poszukiwanie klucza 3
Korzeń 6, Klucz < 6, Idź na lewo,
6
Wierzchołek 2, Klucz > 2, Idź na
prawo,
Wierzchołek 4, Klucz < 4, Idź na
lewo,
8
2
Wierzchołek 3, Klucz == 3. Stop
Czasy operacji: Porównanie: O(1)
Poszukiwanie klucza: O(głebokość),
˛
jeśli klucz jest O(wysokość drzewa),
jeśli klucza nie ma
Złożoność czasowa: O(wysokość
drzewa)
Bożena Woźna-Szcześniak (AJD)
1
7
4
3
Algorytmy i Struktury Danych.
NIL
NIL
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 while
return NULL;
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
34 / 47
Node* find (int Value, Node* node) – wersja
rekurencyjna
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;
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
35 / 47
BST - wyszukiwanie elementu maksymalnego i
minimalnego
Jeżeli chcemy znaleźć element
minimalny (maksymalny) w
drzewie to poruszamy sie˛
maksymalnie w lewo (prawo).
15
7
13
4
2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
30
NIL
25
NIL
34
27
Wykład 10
36 / 47
BST - wyszukiwanie elementu maksymalnego i
minimalnego
Jeżeli chcemy znaleźć element
minimalny (maksymalny) w
drzewie to poruszamy sie˛
maksymalnie w lewo (prawo).
15
Na rysunku obok niebieska droga
to poszukiwanie minimum,
czerwona - maksimum.
7
13
4
2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
30
NIL
25
NIL
34
27
Wykład 10
36 / 47
BST - wyszukiwanie elementu maksymalnego i
minimalnego
Jeżeli chcemy znaleźć element
minimalny (maksymalny) w
drzewie to poruszamy sie˛
maksymalnie w lewo (prawo).
15
Na rysunku obok niebieska droga
to poszukiwanie minimum,
czerwona - maksimum.
Specyficzne rozmieszczenie
elementów w drzewie sprawia, że
element minimalny znajduje sie˛
zawsze w najbardziej
“wysunietym
˛
na lewo” w˛eźle, a
element maksymalny w
najbardziej “wysunietym
˛
na
prawo” w˛eźle drzewa.
Bożena Woźna-Szcześniak (AJD)
7
13
4
2
Algorytmy i Struktury Danych.
30
NIL
25
NIL
34
27
Wykład 10
36 / 47
Wstawienie nowego elementu do BST
Cel: dodanie nowego elementu do drzewa;
Dane wejściowe:
Dowiazanie
˛
do korzenia drzewa ‘Root’;
Nowe dane elementarne;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
37 / 47
Wstawienie nowego elementu do BST - idea
Utwórz element i ustal dane elementarne;
Znajdź miejsce wstawienia elementu w drzewie:
Aby znaleźć miejsce na nowy element w drzewie BST, to
poczawszy
˛
od korzenia należy porównywać nowy element z
w˛ezłem i jeżeli jest on mniejszy od wartości przechowywanej w tym
w˛eźle to poruszać sie˛ w lewo po drzewie, w przeciwnym wypadku
poruszać sie˛ w prawo.
W˛edrujemy tak długo, aż dojdziemy do miejsca, w którym
napotkany wskaźnik do potomka w w˛eźle bedzie
˛
wskazywał na
NULL.
Wstaw nowy wezeł
˛
w wskazane miejsce, a wspomniany wyżej
wskaźnik ustaw tak, aby wskazywał na nowy wezeł.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
38 / 47
void Insert (int Value, Node**next) - wersja
rekurencyjna
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 );
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
39 / 47
Wstawienie nowego elementu do BST - idea
6
Wierzchołek 6, Klucz < 6, Idź na
lewo,
Wierzchołek 2, Klucz > 2, Idź na
prawo,
8
2
Wierzchołek 4, Klucz > 4, Idź
prawo,
1
NULL, Wstaw 5.
Złożoność czasowa: O(wysokość
drzewa)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
7
4
3
NIL
5
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 korzenia
Node* 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
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
41 / 47
Usuwanie danego elementu do BST - idea
Cel: Usuniecie
˛
wezła
˛
z drzewa;
Dane wejściowe:
Dowiazanie
˛
do korzenia drzewa ‘Root’;
Opis elementu usuwanego, np. wartość danej elementarnej;
Uwagi:
Przypadek 1: w˛ezeł jest liściem;
Przypadek 2: w˛ezeł ma jednego potomka;
Przypadek 3: w˛ezeł ma dwóch potomków;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
42 / 47
Przypadek 1: w˛ezeł jest liściem;
6
Usuwany w˛ezeł nie ma
potomstwa, np. w˛ezeł 5.
Jest to najprostsza sytuacja.
Należy usunać
˛ ten element
(zwolnić pamieć) i zadbać o to,
aby jego rodzic wskazywał na
NULL.
8
2
1
7
4
NIL
Złożoność czasowa:
O(wysokość drzewa)
3
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
5
Wykład 10
43 / 47
Przypadek 2: w˛ezeł ma jednego potomka;
6
Usuwany w˛ezeł posiada jednego
potomka, np. 8
Należy tutaj zadbać (oprócz
zwolnienia pamieci)
˛ o to, aby
rodzic usuwanego elementu
wskazywał teraz zamiast na
usuwany element, na jego
potomka .
1
Złożoność czasowa:
O(wysokość drzewa)
Bożena Woźna-Szcześniak (AJD)
8
2
3
Algorytmy i Struktury Danych.
7
4
NIL
5
Wykład 10
44 / 47
Przypadek 3: w˛ezeł ma dwóch potomków;
Aby usunać
˛ taki w˛ezeł
posiadajacy
˛ dwóch potomków,
należy zamienić wartość z tego
w˛ezła z wartościa˛ minimalna˛ w
prawym poddrzewie usuwanego
w˛ezła lub z wartościa˛
maksymalna˛ w lewym
poddrzewie. Nastepnie,
˛
usuwamy
element minimalny w prawym
poddrzewie, ewentualnie
maksymalny w lewym
poddrzewie.
Po takiej zamianie element
minimalny (maksymalny) nie
bedzie
˛
miał potomstwa lub co
najwyżej bedzie
˛
miał jedynie
prawego (lewego) syna.
Bożena Woźna-Szcześniak (AJD)
Złożoność czasowa:
O(wysokość drzewa)
Usuwany wezeł:
˛
6
6
8
2
1
Algorytmy i Struktury Danych.
7
4
3
NIL
5
Wykład 10
45 / 47
Usuwany w˛ezeł: 6
Usuwany wezeł:
˛
6
6
8
2
1
7
4
3
NIL
5
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
46 / 47
Usuwany w˛ezeł: 6
Najpierw szukamy elementu
maksymalnego w lewym
poddrzewie. Jest nim 5.
Usuwany wezeł:
˛
6
6
6
8
2
8
2
1
7
4
NIL
1
3
7
4
NIL
5
3
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
5
Wykład 10
46 / 47
Usuwany w˛ezeł: 6
Nastepnie
˛
zamieniamy usuwany
element (6) ze znalezionym.
elementem maksymalnym w
lewym poddrzewie (5).
6->5
8
2
1
7
4
3
NIL
5->6
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 10
47 / 47
Usuwany w˛ezeł: 6
Nastepnie
˛
zamieniamy usuwany
element (6) ze znalezionym.
elementem maksymalnym w
lewym poddrzewie (5).
6->5
7
4
3
5->6
Bożena Woźna-Szcześniak (AJD)
8
2
8
2
1
Usuwamy wezeł,
˛
który zawierał
element maksymalny (5) w lewym
poddrzewie. Teraz wezeł
˛
ten
zawiera wartość 6.
5
NIL
1
7
4
3
Algorytmy i Struktury Danych.
NIL
6
Wykład 10
47 / 47
Download