Upload
lynda
View
49
Download
0
Embed Size (px)
DESCRIPTION
DRZEWA. pseudokody algorytmów. Rekurencyjne przechodzenie przez drzewo – Funkcje rekurencyjne pobierają jako argument łącze do drzewa i wywołują funkcję visit, której argumentem jest węzeł drzewa. PREORDER void traverse(link h, void visit(link)) { if (h == 0) return; visit(h); - PowerPoint PPT Presentation
Citation preview
DRZEWA
pseudokody algorytmów
Rekurencyjne przechodzenie przez drzewo – Funkcje rekurencyjne pobierają jako argument łącze do drzewa i wywołują funkcję visit, której
argumentem jest węzeł drzewa.
PREORDERvoid traverse(link h, void visit(link)) { if (h == 0) return; visit(h); traverse(h->l, visit); traverse(h->r, visit); }
INORDER
void traverse(link h, void visit(link))
{
if (h == 0) return;
traverse(h->l, visit);
visit(h);
traverse(h->r, visit);
}
POSTORDER
void traverse(link h, void visit(link))
{
if (h == 0) return;
traverse(h->l, visit);
traverse(h->r, visit);
visit(h);
}
Nierekurencyjne przechodzenie przez drzewo (postorder)
void traverse(link h, void visit(link)) { STACK<link> s(max); s.push(h); while (!s.empty()) { visit(h = s.pop());
if (h->r != 0) s.push(h->r);
if (h->l != 0) s.push(h->l);
} }
Przechodzenie za pomocą przekształcania drzewa - algorytm Josepha M.Morrisa (inorder)
while nie koniecif węzeł nie ma lewego syna
{odwiedź go;idź w prawo;}
else {uczyń go prawym synem jego poprzednika;idź do korzenia tego poddrzewa;}
void balance ( dane [ ], int pocz, int kon){ if (pocz <= kon)
{ int m=(pocz+kon)/2;wstaw (dane[m]);balance (dane,pocz,m-1);balance (dane, m+1,kon);}
}
rotacjaprawa (S,O) // można wykonać na węźle dla // którego istnieje lewy syn
{if O nie jest korzeniem
zastępujemy O przez S;prawe poddrzewo S staje się lewym poddrzewem O;węzeł O staje się prawym synem węzła S;}
D D
O S
S A B O B C C A
Utwórz_winorośl (korzeń, n) // prawe rotacje na węzłach // mających lewych synów
{
tmp = korzeń;
while (tmp != NULL)
if tmp ma lewego syna
{
wykonaj rotację tego syna względem tmp;
tmp = węzeł, który został ojcem;
}
else
tmp = węzeł, który jest prawym synem tmp;
}
Pierwszy etap algorytmu DSW – prostowanie drzewa.
Drugi etap - tworzenie drzewa doskonale zrównoważonego
Utwórz_drzewo_doskonałe (n)
{
m = ;
wykonaj n-m rotacji od korzenia;
while (m>1)
m=m/2;
wykonaj m rotacji od korzenia;
}
12 ))1(ln( nfloor
W każdym przejściu w dół winorośli co drugi węzeł aż do pewnego miejsca jest rotowany w lewo wokół swego rodzica. Pierwsze przejście jest potrzebne, aby uzyskać różnicę liczby węzłów w winorośli i liczby węzłów w najbliższym pełnym drzewie binarnym.
12 ))1(ln( nfloor
Wstawianie elementu do kolejki realizowane jest jako dodanie do kopca ostatniego liścia; potem następuje odtworzenie własności kopca (poprzez przesuwanie ostatniego liścia ku korzeniowi dopóki nie dojdzie do korzenia lub nie trafi na ojca o mniejszej wartości).
WstawDoKolejki (el)
{
wstaw el na koniec kopca (jako ostatni liść);
while ( el nie jest korzeniem i el > rodzic(el) )
zamień miejscami el i rodzic(el);
}
Algorytm wstawiania elementu do kolejki
Pobieranie elementu z kolejki polega na pobraniu elementu z korzenia, zastąpieniu go ostatnim liściem i odtworzeniu własności kopca idąc od korzenia w dół.
PobierzZKolejki ( ) {
pobierz element z korzenia;wstaw do korzenia element z ostatniego liścia;usuń ostatni liść; //obydwa poddrzewa korzenia są kopcamip=korzeń;while ( p nie jest liściem i p < któregokolwiek swojego dziecka)
zamień miejscami p i jego większe dziecko; }
Algorytm pobierania elementu z kolejki