12
DRZEWA pseudokody algorytmów

DRZEWA

  • 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

Page 1: DRZEWA

DRZEWA

pseudokody algorytmów

Page 2: DRZEWA

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); }

Page 3: DRZEWA

INORDER

void traverse(link h, void visit(link))

{

if (h == 0) return;

traverse(h->l, visit);

visit(h);

traverse(h->r, visit);

}

Page 4: DRZEWA

POSTORDER

void traverse(link h, void visit(link))

{

if (h == 0) return;

traverse(h->l, visit);

traverse(h->r, visit);

visit(h);

}

Page 5: DRZEWA

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);

} }

Page 6: DRZEWA

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;}

Page 7: DRZEWA

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);}

}

Page 8: DRZEWA

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

Page 9: DRZEWA

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.

Page 10: 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

Page 11: DRZEWA

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

Page 12: DRZEWA

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