STRUKTURY DANYCH DRZEWA BINARNE PENE DRZEWO BINARNE T
STRUKTURY DANYCH
DRZEWA BINARNE
PEŁNE DRZEWO BINARNE T ilość węzłów = 15 ( n = 15 ) h = log 2 n , n wysokość = 3 ( h. T = 3 ) n - ilość węzłów w pełnym drzewie binarnym = 20 + 21 + 22 + … + 2 h = 2 h+1 - 1
METODY PRZEGLĄDANIA DRZEWA BINARNEGO * + a d / b metoda pre-order (wzdłużna) metoda in-order ( poprzeczna) metoda post-order (wsteczna ) c * e - notacja przedrostkowa - notacja powszechnie stosowana - notacja przyrostkowa f
* + a d / b metoda in-order : a + b/c * d - e * f c * e f
IMPLEMENTACJA W PASCALU type wsk= ^wezel; wezel = record lewe: wsk; klucz : integer; prawe: wsk end ; var drzewo : wsk ;
ZNAJDOWANIE W DRZEWIE POSZUKIWAŃ BINARNYCH ELEMENTU O PODANYM KLUCZU klucz = 22 drzewo
PRZEGLĄDANIE BST METODĄ "IN-ORDER" DAJE W WYNIKU LISTĘ POSORTOWANYCH KLUCZY PRZECHOWYWANYCH W WĘZŁACH A D E G H K L M N O P T V
WSTAWIANIE DO DRZEWA BST ELEMENTU O PODANYM KLUCZU klucz = 21 drzewo
PROCEDURA WSTAWIANIA ELEMENTU O KLUCZU Z DO DRZEWA POSZUKIWAŃ BINARNYCH TREE-INSERT (T, z) begin y: = NIL; x: = root(T); {korzeń drzewa T} while x NIL do begin y : = x; if key(z) < key(x) then x : = left(x) else x: = right(x); end; p(z) : = y; { p(z) - ojciec węzła z} if y = NIL then root(T) : = z else if key(z) < key(y) then left(y) : = z else right(y) : = z; end;
KOPCE BINARNE
JAKO PRAWIE PEŁNE DRZEWO BINARNE Tr : ( klucz(v) klucz(PARENT(v) ) v V(T) v r 20 17 15 10 6 12 2 9 5 ( klucz(left(v)) klucz(v) and klucz(right(v)) klucz(v) ) v V(T) 8
JAKO TABLICA A[ 1. . n ] , n > 0 20 17 15 10 12 9 8 ( A[i] A[ PARENT (i) ] ) 2 i n PARENT (i) return i/2 ; LEFT (i) return 2*i; RIHGT (i) return 2*i +1; 6 2 5
OPERACJE NA KOPCACH BINARNYCH • BUILD-HEAP • EXTRACT -MAX • INSERT
TWORZENIE KOPCA BINARNEGO BUILD-HEAP(A, n); begin hsize(A) : = n; for i: = n/2 downto 1 do HEAPIFY (A, i ); end;
PRZYWRACANIE WŁASNOŚCI KOPCA BINARNEGO HEAPIFY (A, hsize, i) ; begin lewy : = 2*i; prawy : = 2*i+1; if lewy <= hsize then naj : = indeks elementu większego spośród elementów: A[lewy], A[i]; if prawy <= hsize then naj : = indeks elementu większego spośród elementów: A[prawy], A[naj] if naj <> i then begin zamień A[i] z A[naj]; HEAPIFY (A, naj) end;
HEAP-EXTRACT-MAX (A, hsize ) begin if hsize < 1 then error; max : = A[1]; A[1] : = A[hsize]; hsize : = hsize - 1; HEAPIFY (A, 1); return max; end;
HEAP-INSERT (A, klucz, hsize); begin hsize : = hsize + 1; i : = hsize; while i > 1 and A[PARENT(i)] < klucz do begin A[i] : = A[PARENT(i)] ; i: = PARENT(i); end; A[i] : = klucz; end;
SORTOWANIE PRZEZ KOPCOWANIE HEAPSORT (A, n); begin hsize : = n; BUILD-HEAP (A); for i : = n downto 2 do begin zamień A[1] z A[i]; hsize : = hsize -1; HEAPIFY (A, 1); end;
STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
X = {x 1, . . . , xn} S = { S 1, S 2, . . . , Sk } - rodzina zbiorów parami rozłącznych, Si X, i =1, . . . , k (wyróżniamy S S i element x Si - reprezentant zbioru Si ) Oznaczenie : Sx - zbiór z rodziny S o reprezentancie x
OPERACJE NA RODZINIE S : • MAKE-SET(x) x S 1 S 2 . . . Sk - tworzy jednoelementowy zbiór zawierający x, którego reprezentantem jest x • UNION(x, y) - dodaje do rodziny S zbiór Sz = Sx Sy , gdzie z jest dowolnym elementem ze zbioru Sx Sy , usuwa zbiory Sx , Sy z S • FIND - SET(x) - znajduje reprezentanta zbioru zawierającego element x
PRZYKŁADY ZASTOSOWANIA STRUKTUR DANYCH DLA ZBIORÓW ROZŁĄCZNYCH : • rozpoznawanie spójnych składowych w grafie niezorientownym • algorytm Kruskala
REPREZENTACJE ZBIORÓW ROZŁĄCZNYCH : LISTY DRZEWA MAKE-SET(x) O(1) UNION(x, y) O(|Sx|) O(1) FIND - SET(x) O(1) O(|Sx|)
- Slides: 24