Rekurencyjne struktury danych

advertisement
Rekurencyjne struktury danych
Andrzej Jastrz¦bski
Akademia ETI
Politechnika Gda«ska
Rekurencyjne struktury danych
Dynamiczny przydziaª pami¦ci
Pami¦¢, która jest przydzielana na pocz¡tku dziaªania procesu to:
pami¦¢ programu czyli instrukcje programu
pami¦¢ statyczna zwi¡zana ze zmiennymi globalnymi i
zmiennymi statycznymi
pami¦¢ stosu na stosie tworzone s¡ zmienne lokalne oraz ±lad
wywoªania procedury
Najcz¦±ciej podczas uruchamiania programu nie wiadomo ile
pami¦ci b¦dzie potrzebowaª. Na przykªad, je±li chcemy napisa¢
program sortuj¡cy ci¡g liczb, to na pocz¡tku nie wiemy ile liczb
b¦dziemy musieli posortowa¢.
Aby rozwi¡za¢ ten problem trzeba wprowadzi¢ poj¦cie
dynamicznego przydziaªu pami¦ci. Dynamiczny przydziaª pami¦ci
pozwala na uzyskanie dodatkowej pami¦ci nie zwi¡zanej z pami¦ci¡
przyznan¡ na pocz¡tku dziaªania procesu.
W j¦zykach programowania dynamiczny przydziaª pami¦ci jest
realizowany przez operator new.
Politechnika Gda«ska
Rekurencyjne struktury danych
Przykªad
int main() {
int n, *tab;
cin>>n;
tab = new int[n]; //pro±ba o przyznanie pami¦ci
//na n elementow¡ tablic¦ intów
for(int i=0; i<n; i++)
cin>>tab[i];
delete [] tab; //zwolnienie przydzielonej pami¦ci
return 0;
}
Politechnika Gda«ska
Rekurencyjne struktury danych
Dealokacja pami¦ci
Je±li nie potrzebujemy przydzielonej pami¦ci, nale»y wywoªa¢
funkcj¦/operator dealokacji.
Automatyczna dealokacja pami¦ci
W j¦zykach C oraz C++ nie ma wbudowanej automatycznej
dealokacji pami¦ci.
J¦zyki Java, Python, PHP itp. zaopatrzono w automatyczn¡
dealokacj¦, czyli tak zwany garbage collector.
Politechnika Gda«ska
Rekurencyjne struktury danych
Dynamiczna alokacja pami¦ci
int *pam;
pam = (int*) malloc(sizeof(int));
//alokacja pojedynczej liczby, j¦zyk C
pam = new int;
//alokacja pojedynczej liczby, j¦zyk C++
pam = (int*) malloc(sizeof(int)*n);
//alokacja n-elementowej tablicy liczb, j¦zyk C
pam = new int[n];
//alokacja n-elementowej tablicy liczb, j¦zyk C++
Dealokacja pami¦ci
free(pam);
//dealokacja pojedynczej liczby lub tablicy, j¦zyk C
delete pam;
//dealokacja pojeddynczej liczby, j¦zyk C++
delete [] pam;
//dealokacja tablicy liczb, j¦zyk C++
Politechnika Gda«ska
Rekurencyjne struktury danych
Lista
Lista jest struktur¡ zªo»on¡ z sekwencji rekordów. Ka»dy rekord ma
odniesienie do innego rekordu.
Politechnika Gda«ska
Rekurencyjne struktury danych
Lista jednokierunkowa
struct ElListy1 {
int val; //cz¦±¢ danych
struct ElListy *next;
};
Lista dwukierunkowa
struct ElListy2 {
int val; //cz¦±¢ danych
struct ElListy *next, *prev;
};
Politechnika Gda«ska
Rekurencyjne struktury danych
Gªowa, ogon
Ogonem nazywamy element x taki, »e x.next==NULL.
Element x jest gªow¡ je±li nie istnieje »aden element y taki, »e
y.next==x.
Politechnika Gda«ska
Rekurencyjne struktury danych
NULL
NULL
NULL
Politechnika Gda«ska
Rekurencyjne struktury danych
void newElem1(struct ElListy1 **firstEl, int v) {
struct ElListy1 *tmpEl;
tmpEl = (struct ElListy1*) malloc(sizeof(*tmpEl));
tmpEl->val = v;
tmpEl->next = *firstEl;
*firstEl = tmpEl;
}
void delFirst1(struct ElListy1 **firstEl) {
struct ElListy1 *next = (*firstEl)->next;
free(*firstEl);
*firstEl = next;
}
Politechnika Gda«ska
Rekurencyjne struktury danych
Wytªumaczenie napisu **rstEl
W powy»szym przykªadzie i w kolejnych procedury maj¡ deklaracj¦:
void nazwaProc(struct ElListy **firstEl, ....)
Funkcje te wywoªuje si¦ nast¦puj¡co:
struct ElListy *pierwszyEl;
.
.
.
nazwaProc(&prierwszyEl);
Jest to spowodowane tym, »e w procedurach tych nale»y zmieni¢
wska¹nik na pierwszy element.
Politechnika Gda«ska
Rekurencyjne struktury danych
Wytªumaczenie napisu **rstEl cd
Mo»na porówna¢ z procedurami:
void add2(int x) { x = x + 2;}
void add2P(int *y) {*y = *y + 2;}
int main() {
int a=0;
add2(a);//po tej operacji a jest nadal równe 0
add2P(&a);//po tej operacji a jest równe 2
return 0;
}
add2 zmienna x jest lokalna, a jej warto±¢ jest kopi¡
a. W procedurze add2P zmienna y jest tak»e lokalna.
Ró»nica polega na tym, »e y co do warto±ci jest równa adresowi w
pami¦ci, w której przechowywana jest zmienna a.
Odniesienie *y = *y + 2; dziaªa na dokªadnie tych samych komórkach
pami¦ci, w których znajduje si¦ a. Powy»sze instrukcje zmieniaj¡ wi¦c
warto±¢ zmiennej a.
W procedurze
warto±ci zmiennej
Politechnika Gda«ska
Rekurencyjne struktury danych
void delLast1(struct ElListy1 **firstEl) {
struct ElListy1 *curr = *firstEl; //curr=*firstEl;
struct ElListy1 *prev = NULL; //prev=NULL;
while(curr->next!=NULL) {
prev = curr;
next = curr->next;
}
free(curr); //zwalniamy pami¦¢, któr¡ zajmowaª ostatni ele
if(prev==NULL) //byª jeden element w li±cie
*firstEl = NULL;
else //byªo kilka elementów w li±cie
prev->next = NULL;
}
Politechnika Gda«ska
Rekurencyjne struktury danych
void newElem2(struct ElListy2 **firstEl, int v) {
struct ElListy2 *tmpEl;
tmpEl = (struct ElListy2*) malloc(sizeof(*tmpEl));
tmpEl->val = v;
tmpEl->next = *firstEl;
tmpEl->prev = NULL;
if(*firstEl!=NULL) //na li±cie nie ma elementów
(*firstEl)->prev = tmpEl;
*firstEl = tmpEl;
}
void delFirst2(struct ElListy2 **firstEl) {
struct ElListy2 *next = firstEl->next;
free(*firstEl);
if(next!=NULL) next->prev = NULL;
*firstEl = next;
}
Politechnika Gda«ska
Rekurencyjne struktury danych
void delLast2(struct ElListy2 **firstEl) {
struct ElListy2 *curr = *firstEl;
while(curr->next!=NULL)
curr = curr->next;
if(curr->prev==NULL) {//jest jeden element w li±cie
free(curr);
*firstEl = NULL;
return;
}
curr = curr->prev;
//cofamy si¦ do przedostatniego elementu
free(curr->next);
//zwalniamy pami¦¢, któr¡ zajmowaª ostatni element
curr->next = NULL;
}
Politechnika Gda«ska
Rekurencyjne struktury danych
Zaªo»enia - listy jednokierunkowe
Niech x, y, curr b¦d¡ wska¹nikami na struktur¦ ElListy1. Dla
list jednokierunkowych mamy zaªo»enie: p¦tla
while(curr)
curr = curr->next;
nie jest niesko«czona dla ka»dego pocz¡tkowego curr nale»¡cego
do listy.
Nie istniej¡ dwa elementy listy, które wskazuj¡ na ten sam element,
czyli x->next!=y->next.
Politechnika Gda«ska
Rekurencyjne struktury danych
Zaªo»enia - listy dwukierunkowe
Niech curr b¦dzie wska¹nikiem na struktur¦ ElListy2. Dla list
dwukierunkowych mamy zaªo»enie: p¦tle
while(curr)
curr = curr->next;
while(curr)
curr = curr->prev;
nie s¡ niesko«czone dla ka»dego pocz¡tkowego curr nale»¡cego do
listy.
Je±li curr->next!=NULL, wtedy zachodzi
curr->next->prev==curr. Nie istniej¡ dwa elementy listy, które
wskazuj¡ na ten sam element, czyli x->next!=y->next.
Politechnika Gda«ska
Rekurencyjne struktury danych
Zªo»ono±ci obliczeniowe
Dla n elementowej listy mamy nast¦puj¡ce zªo»ono±ci obliczeniowe:
dodawanie O(1)
usuwanie pierwszego elementu O(1)
usuwanie ostatniego elementu O(n) (je±li istnieje wska¹nik
na ostatni element w li±cie dwukierunkowej wtedy O(1))
sortowanie O(n log n) (mergesort)
dost¦p do elementu O(n)
szukanie elementu O(n)
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodatki
Inne rodzaje list:
listy jednokierunkowe cykliczne
listy dwukierunkowe cykliczne
listy cykliczne z wartownikiem
Mo»na zaimplementowa¢ list¦ na tablicy struktur.
Politechnika Gda«ska
Rekurencyjne struktury danych
Je±li tablica ma n elementów to wiemy, »e dla tablicy zªo»ono±ci
obliczeniowe s¡ nast¦puj¡ce:
dodawanie O(n)
usuwanie O(n)
sortowanie O(n log n)
dost¦p do elementu O(1)
szukanie w tablicy nieposortowanej O(n)
szukanie w tablicy posortowanej O(log n)
Politechnika Gda«ska
Rekurencyjne struktury danych
Struktura drzewa binarnego wyszukiwa« mo»e by¢ podana przez
zaªo»enia podanych poni»ej.
Drzewo zbudowane jest z w¦zªów, które:
niepuste drzewo ma w¦zeª wyró»nony korze«
ka»dy w¦zeª oprócz korzenia posiada jednego ojca (w¦zeª
poprzedzaj¡cy)
ka»dy w¦zeª posiada conajwy»ej dwóch synów (binarno±¢
drzewa)
syn w¦zªa X ma ojca X warunek drzewa
wszystkie warto±ci lewego poddrzewa w¦zªa X maj¡ mniejsze
warto±ci od warto±ci w¦zªa X (drzewo wyszukiwa«)
wszystkie warto±ci prawego poddrzewa w¦zªa X maj¡ wi¦ksze
warto±ci od warto±ci w¦zªa X (drzewo wyszukiwa«)
Politechnika Gda«ska
Rekurencyjne struktury danych
Element drzewa w¦zeª
struct Node {
int val; //cz¦±¢ na dane
struct Node *left, *right, *parent;
}
Politechnika Gda«ska
Rekurencyjne struktury danych
Zaªo»enia dla drzewa
Niech root, curr s¡ wska¹nikami na struktur¦ Node. Je±li root
jest wska¹nikiem na korze«, wtedy root->parent==NULL.
Je±li curr jest dowolnym wska¹nikiem na w¦zeª drzewa, to:
je±li curr->left!=NULL, to curr->left->parent==curr;
je±li curr->right!=NULL, to curr->right->parent==curr.
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodawanie elementu do drzewa
Dodaj¡c element do drzewa nale»y korzystaj¡c z algorytmu szukania
elementu w drzewie znale¹¢ ostatni w¦zeª (X ) w algorytmie.
je±li jest to w¦zeª z tak¡ sam¡ warto±ci¡ jak¡ chcemy doda¢
wtedy jej nie dodajemy (bo ju» jest w drzewie)
je±li warto±¢ w¦zªa, który dodajemy, jest wi¦kszy od warto±ci
w¦zªa X , wtedy w¦zeª X nie posiada prawego syna (z
algorytmu szukania) i mo»emy w to miejsce doda¢ nowy w¦zeª
je±li warto±¢ w¦zªa, który dodajemy, jest mniejszy od warto±ci
w¦zªa X , wtedy w¦zeª X nie posiada lewego syna (z algorytmu
szukania) i mo»emy w to miejsce doda¢ nowy w¦zeª
Politechnika Gda«ska
Rekurencyjne struktury danych
void add(struct Node **root, int v) {
struct Node *curr, *prev;
if(*root==NULL) { //brak w¦zªów w drzewie
*root = (struct Node*) malloc(sizeof(*curr));
(*root)->parent = (*root)->left = (*root)->right = NULL;
(*root)->val = v;
return;
}
prev = NULL; curr = *root; //pocz¡tkowe dane do wyszukiwania
while(curr!=NULL&&curr->val!=v) {
prev = curr;
if(curr->val>v) curr = curr->left;
else curr = curr->right;
}
if(curr!=NULL) return; //oznacza to, »e curr->val==v
curr = (struct Node*) malloc(sizeof(*curr));
curr->parent = prev;
curr->left = curr->right = NULL;
curr->val = v;
if(prev->val>v) prev->left = curr;
else prev->right = curr;
}
Politechnika Gda«ska
Rekurencyjne struktury danych
root =nul tmp
Politechnika Gda«ska
n_wez
Rekurencyjne struktury danych
Dodajemy 8
root =nul tmp
Politechnika Gda«ska
n_wez
Rekurencyjne struktury danych
Dodajemy 8
root =nul tmp
n_wez
8
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 8
root
tmp
n_wez
8
Politechnika Gda«ska
Rekurencyjne struktury danych
root
tmp
n_wez
8
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 13
root
tmp
n_wez
8
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 13
root
tmp
n_wez
8
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 13
root
tmp
n_wez
8
13
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 13
root
tmp
n_wez
8
13
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 13
root
tmp
n_wez
8
13
Politechnika Gda«ska
Rekurencyjne struktury danych
root
tmp
n_wez
8
13
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 18
root
tmp
n_wez
8
13
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 18
root
tmp
n_wez
8
13
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 18
root
tmp
n_wez
8
13
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 18
root
n_wez
tmp
8
13
18
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 18
root
n_wez
tmp
8
13
18
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 18
root
n_wez
tmp
8
13
18
Politechnika Gda«ska
Rekurencyjne struktury danych
root
n_wez
tmp
8
13
18
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 15
root
n_wez
tmp
8
13
18
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 15
root
n_wez
tmp
8
13
18
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 15
root
n_wez
tmp
8
13
18
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 15
root
n_wez
tmp
8
13
18
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 15
root
n_wez
tmp
8
13
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 15
root
n_wez
tmp
8
13
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 15
root
n_wez
tmp
8
13
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
root
n_wez
tmp
8
13
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 11
root
n_wez
tmp
8
13
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 11
root
n_wez
tmp
8
13
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 11
root
n_wez
tmp
8
13
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 11
n_wez
tmp
root
8
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 11
n_wez
tmp
root
8
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 11
n_wez
tmp
root
8
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
n_wez
tmp
root
8
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 5
n_wez
tmp
root
8
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 5
n_wez
tmp
root
8
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 5
n_wez
tmp
root
8
5
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 5
n_wez
tmp
root
8
5
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 5
n_wez
tmp
root
8
5
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
n_wez
tmp
root
8
5
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 12
n_wez
tmp
root
8
5
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 12
n_wez
tmp
root
8
5
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 12
n_wez
tmp
root
8
5
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 12
n_wez
tmp
root
8
5
13
11
18
15
Politechnika Gda«ska
Rekurencyjne struktury danych
Dodajemy 12
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
Rekurencyjne struktury danych
Dodajemy 12
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
Rekurencyjne struktury danych
Dodajemy 12
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
Rekurencyjne struktury danych
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
Rekurencyjne struktury danych
Dodajemy 22
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
Rekurencyjne struktury danych
Dodajemy 22
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
Rekurencyjne struktury danych
Dodajemy 22
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
Rekurencyjne struktury danych
Dodajemy 22
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
Rekurencyjne struktury danych
Dodajemy 22
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Dodajemy 22
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Dodajemy 22
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Dodajemy 2
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Dodajemy 2
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Dodajemy 2
n_wez
tmp
root
8
5
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Dodajemy 2
n_wez
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Dodajemy 2
n_wez
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Dodajemy 2
n_wez
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
n_wez
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
root
8
5
2
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukanie elementu w drzewie
Aby znale¹¢ element o zadanej warto±ci korzystamy z operacji:
je±li warto±¢ szukana jest wi¦ksza od warto±ci w¦zªa
aktualnego, wtedy przechodzimy do prawego syna; je±li w¦zeª
nie posiada prawego syna, wtedy elementu nie ma w drzewie;
je±li warto±¢ szukana jest mniejsza od warto±ci w¦zªa
aktualnego, wtedy przechodzimy do lewego syna; je±li w¦zeª
nie posiada lewego syna, wtedy elementu nie ma w drzewie;
je±li warto±¢ szukana jest równa warto±ci w¦zªa aktualnego,
wtedy znale¹li±my w¦zeª.
Operacje t¡ zaczynamy od korzenia.
Politechnika Gda«ska
Rekurencyjne struktury danych
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 9
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 9
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 9
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 9
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Nie znaleziona 9
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 2
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 2
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 2
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 2
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Znaleziona 2
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 15
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 15
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 15
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 15
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Szukamy liczby 15
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Znaleziona 15
tmp
root
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Usuwanie elementu z drzewa
Usuwanie elementu z zadan¡ warto±ci¡, tak»e u»ywa algorytmu
szukania jako pomocniczego.
Szukamy w¦zªa o zadanej warto±ci.
je±li w¦zeª jest li±ciem (nie ma lewego ani prawego syna),
wtedy usuwamy
je±li w¦zeª nie posiada lewego syna, wtedy zast¦pujemy
usuwany w¦zeª przez caªe prawe poddrzewo
je±li w¦zeª nie posiada prawego syna, wtedy zast¦pujemy
usuwany w¦zeª przez caªe lewe poddrzewo
je±li w¦zeª posiada lewego i prawego syna, wtedy z lewego
poddrzewa szukamy maksymalnego (albo z prawego
poddrzewa szukamy minimalnego) w¦zªa i usuwamy go, a jego
warto±¢ zamieniamy z wyszukanym w¦zªem
Je±li usuwamy korze«, wtedy musimy zmieni¢ wska¹nik, aby
wskazywaª na nowy korze«.
Politechnika Gda«ska
Rekurencyjne struktury danych
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 2
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 2
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 2
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 2
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 2
tmp
root
kas
8
5
13
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 11
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 11
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 11
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 11
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 11
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 11
root
tmp
kas
8
5
13
2
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 11
tmp
root
kas
8
5
13
2
12
18
15
Politechnika Gda«ska
22
Rekurencyjne struktury danych
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 8
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 8
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 8
tmp
root
kas
8
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 8
tmp
root
kas
11
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 8
tmp
root
kas
11
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 8
tmp
root
kas
11
5
13
2
11
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 8
root
tmp
kas
11
5
13
2
18
12
Politechnika Gda«ska
15
22
Rekurencyjne struktury danych
Kasujemy 8
tmp
root
kas
11
5
13
2
12
18
15
Politechnika Gda«ska
22
Rekurencyjne struktury danych
Zªo»ono±¢ obliczeniowa
Je±li drzewo ma n elementów i wysoko±¢ h wtedy:
dodawanie O(h) (O(n))
usuwanie O(h) (O(n))
szukanie O(h) (O(n))
Politechnika Gda«ska
Rekurencyjne struktury danych
Samo drzewo posiada gorsze zªo»ono±ci pesymistyczne ni» tablica.
Mo»na jednak stworzy¢ drzewa, dla których h = O(log n). S¡ to:
drzewa czerwono czarne
drzewa AVL
Drzewa te korzystaj¡ z obrotów drzewa wzgl¦dem w¦zªów.
Politechnika Gda«ska
Rekurencyjne struktury danych
Download