odpowiedzi do zadań z drzew

Transkrypt

odpowiedzi do zadań z drzew
Algorytmy i programowanie
Drzewa - algorytmy
1. Napisać w pseudokodzie procedurę iteracyjną wypisującą węzły drzewa binarnego w kolejności: a)
preorder, b) inorder, c) postorder.
Odpowiedź 1.
a)
procedure PreorderRek(x)
if not (x = NIL)
then wypisz key [x]
InorderRek(left [x])
InorderRek(right [x])
procedure PreorderIter(T )
Push (A, root [T ])
while not StockEmpty (A)
do x ← Pop (A)
wypisz key [x]
if not right [x] = NIL
then Push (A, right [x])
if not left [x] = NIL
then Push (A, left [x])
b)
procedure InorderRek(x)
if not (x = NIL)
then InorderRek(left [x])
wypisz key [x]
InorderRek(right [x])
procedure InorderIter(T )
Push (A, root [T ])
x ← left [root [T ]]
while not (x = NIL) or not StockEmpty (A)
do while not x = NIL
do Push (A, x)
x ← left [x]
repeat x ← Pop (A)
wypisz key [x]
until not (right [x] = NIL) or
StockEmpty (A)
x ← right [x]
c)
procedure PostorderRek(x)
if not (x = NIL)
then PostorderRek(left [x])
PostorderRek(right [x])
wypisz key [x]
procedure PostorderIter(T )
x ← root [T ]
while not (x = NIL) or not StockEmpty (A)
do while not (x = NIL)
do Push (A, x)
x ← left [x]
if not (Peek (A) = NIL)
then x ← right [Peek (A)]
Push (A, NIL)
else Pop (A)
zdejmujemy tylko NIL ze stosu
wypisz key [Pop (A)]
x ← NIL
Jak działa algorytm PostorderIter: W przeciwieństwie do wcześniejszych algorytmów w tym
przypadku na stosie znajdują się dwa typy elementów: te do których weszliśmy jeden raz oraz te
których lewe poddrzewa zostały już odwiedzone. Algorytm rozróżnia węzły na stosie A w następujący
sposób: węzeł którego lewe poddrzewo zostało już w całości odwiedzone, nie jest zdejmowany ze stosu,
a za nim na stos wstawiany jest element NIL. Jeżeli algorytm PostorderIter natrafi na wartość
NIL na stosie wie, że następmy po nim element powinien zostać wypisany.
2. Napisać w pseudokodzie następujące funkcje:
a) TreeMinimum (x) - zwracająca węzeł o najmniejszym kluczu,
b) TreeMaximum (x) - zwracająca węzeł o największym kluczu,
c) TreeSearch (x, key) - zwracająca węzeł o zadanym kluczu, a jeśli takiego elementu nie ma
NIL,
d) TreeSuccessor (x) - następnik węzła x w drzewie,
e) TreePredecessor (x) - poprzednik węzła x w drzewie.
Odpowiedź 2.
a)
b)
TreeMinimum(x)
TreeMaximum(x)
while not (left [x] = NIL)
do x ← left [x]
return x
while not (right [x] = NIL)
do x ← right [x]
return x
c)
TreeSearch(x, key)
if (x = NIL) or (key = key [x])
then return x
if key < key [x]
then TreeSearch (left [x] , key)
else TreeSearch (right [x] , key)
d)
TreeSuccessor(x)
if not (right [x] = NIL)
then return TreeMinimum (right [x])
y ← parent [x]
while not (y = NIL) and (x = right [y])
do x ← y
y ← parent [x]
TreeSearchIter(x, key)
while not (x = NIL) or (kwy = key [x])
do if key < key [x]
then x ← left [x]
else x ← right [x]
e)
TreePredecessor(x)
if not (left [x] = NIL)
then return TreeMaximum (left [x])
y ← parent [x]
while not (y = NIL) and (x = left [y])
do x ← y
y ← parent [x]
3. Szukamy w drzewie BST, w którym znajdują się liczy 1, . . . , 1000, liczbę 363. Które z poniższych
ciągów węzłów nie mogą zostać sprawdzone w procedurze TreeSearch :
a) 2, 252, 401, 398, 330, 344, 397, 363;
b) 924, 220, 911, 244, 898, 258, 362, 363;
c) 925, 202, 911, 240, 912, 245, 363;
d) 2, 399, 387, 219, 266, 382, 381, 278, 363;
e) 935, 278, 347, 621, 299, 392, 358, 363;
Odpowiedź 3. c) i d)

Podobne dokumenty