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)