Algoritmi i Strukture Podataka Stabla Zadatak 1 Predstaviti
Algoritmi i Strukture Podataka Stabla
Zadatak 1 Predstaviti jednostruko ulančanu listu pomoću binarnog stabla i realizovati algoritam za nalaženje k-tog elementa u datoj listi. • Binarno stablo: – (izlazni) stepen čvorova je 2: svaki čvor ima najviše 2 direktna potomka – veoma često korišćeno stablo Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 2
Zadatak 1 - rešenje • Bez stabla: 1. 2. 3. 4. • postavi brojač na 0 pristupi prvom čvoru liste povećaj brojač za 1 i proveri da li je brojač = k ako nije pređi na sledeći element liste i pređi na korak 3 Za dugačke liste, pristup elementima na kraju je izuzetno neefikasan (za listu dužine 10 000, prosečan broj ponavljanja koraka 3 i 4 je 5 000 !!) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 3
Zadatak 1 - rešenje Da bi pristup nekom elementu stabla (liste) bio efikasan, stablo treba formirati tako da njegova dubina bude najmanja moguća. Prosečan broj koraka da bi se pristupilo nekom elementu liste od 10 000 elemenata bi bio ~ 13 (log 210000) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 4
Zadatak 1 - rešenje FIND(root, k) r=k p = root while (left(p) nil) do if (r lcount(p)) then p = left(p) else r = r – lcount(p) p = right(p) end_if end_while if (r 1) then p = nil end_if return p Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 5
Zadatak 2 Šta je preorder, a šta inorder obilazak stabla? Ako za jedno binarno stablo preorder obilazak daje poredak ATNEIFCSBDGPMLK, a inorder obilazak daje poredak EINSCFBTGPDLMKA, rekonstruisati izgled ovog stabla i objasniti postupak. • Obilazak stabla: posećivanje svih čvorova samo jednom • Postoji više načina da se obiđe stablo: – – preorder inorder postorder level-order Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 6
Zadatak 2 - rešenje Preorder 1. Poseti se koren 2. Obiđe se levo podstablo na preorder način 3. Obiđe se desno podstablo na preorder način ABCDEF Inorder 1. Obiđe se levo podstablo na inorder način 2. Poseti se koren 3. Obiđe se desno podstablo na inorder način CBDAEF Postorder 1. Obiđe se levo podstablo na postorder način 2. Obiđe se desno podstablo na postorder način 3. Poseti se koren CDBFEA Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka Prvi čvor je koren Prvi čvor je “najlevlji” čvor u stablu Poslednji čvor je koren 7
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK inorder: EINSCFBTGPDLMKA Početak rekonstrukcije stabla: - prvi čvor u inorder poretku, E, “najlevlji” je čvor stabla. Prati se preorder poredak – krećemo od korena A, sve dok se ne dođe do čvora E: A-T-N-E. Sigurno je da je čvor T levi potomak čvora A, N, levi potomak čvora T i E levi potomak čvora N. - u inorder poretku, pre čvora N dolazi čvor I – iz toga se zaključuje da je I desni potomak čvora E, itd. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 8
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK (root left right) inorder: EINSCFBTGPDLMKA (left root right) - A je koren (prvi čvor po preorder-u); iz njegove inorder pozicije možemo zaključiti i da nema desno podstablo (svi preostali ključevi nalaze se levo od A u inorder nalaze se u levom podstablu) - Iz preorder-a „čitamo“ naredni ključ – T : on je koren levog ili desnog podstabla čvora A, a kako smo zaključili da se nalazi levo od A u inorder-u, sledi da je koren levog podstabla - Iz inorder-a dalje možemo da zaključimo da se čvorovi EINSCFB nalaze u levom podstablu T, a GPDLMK u desnom - Sledeći preorder čvor je N – on je koren levog podstabla T; u levom podstablu su EI, u desnom SCFB - Možemo zaključiti i da je D koren desnog podstabla čvora T – od svih čvorova desno, prvi je u preorder-u Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 9
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK (root left right) inorder: EI N SCFB T GP D LMK A (left root right) - E je sledeći čvor po preorder-u, i on se nalazi u levom podstablu N, jer je levo od njega u inorder poretku Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 10
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK (root left right) inorder: EI N SCFB T GP D LMK A (left root right) - I je sledeći čvor po preorder-u; on je desno od E u inorder poretku, što znači da se nalazi u njegovom desnom podstablu, i to je koren tog podstabla - Time smo i završili rekonstrukciju levog podstabla N – prelazimo na desno Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 11
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK (root left right) inorder: EI N SCFB T GP D LMK A (left root right) - Nakon što smo obišli levo podstablo N, po preorder-u sledeće obilazimo desno podstablo N (ako postoji) - Iz inorder obilaska smo zaključili da postoji - To znači da je prvi sledeći čvor koji obilazimo u preorder-u zapravo koren desnog podstabla N – to je čvor F Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 12
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK (root left right) inorder: EI N SCFB T GP D LMK A (left root right) - Iz inorder obilaska dalje možemo zaključiti da su SC u levom podstablu F, a B u desnom - Kako je u preorder obilasku prvi naredni čvor C, on mora biti koren levog podstabla F - Čvor S se nalazi levo od C u inorder-u koren je levog podstabla C - Slično, B je koren desnog podstabla F, čime završavamo obilazak levog podstabla T Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 13
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK (root left right) inorder: EI N SCFB T GP D LMK A (left root right) - Čvor D je koren desnog podstabla čvora T - Čvorovi G i P se nalaze u levom podstablu čvora D (levo, tj. ranije se pojavljuju u inorder obilasku) - Iz preorder obilaska možemo zaključiti da je G koren tog levog podstabla, a potom iz inorder i preorder zaključujemo da je P koren desnog podstabla G Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 14
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK (root left right) inorder: EI N SCFB T GP D LMK A (left root right) - Ostali su još čvorovi LMK – desni potomci čvora D - M je koren (iz preorder), L je levi sin M i K je desni sin M (iz inorder) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 15
Zadatak 2 - rešenje preorder: ATNEIFCSBDGPMLK inorder: EINSCFBTGPDLMKA Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 16
Zadatak 3 Šta je inorder, a šta postorder obilazak stabla? Ako za jedno binarno stablo inorder obilazak daje poredak JBLAEDKCHFGI, a postorder obilazak daje poredak JLBEKDHIGFCA, rekonstruisati izgled ovog stabla i objasniti postupak. Postupak: - u postorder poretku, poslednji čvor je A, koji je sigurno koren stabla - iz inorder poretka zaključujemo da su čvorovi J, B i L u levom podstablu korena, a ostali u desnom - dakle, C je koren desnog podstabla (pretposlednji čvor u postorder poretku), a B je koren levog podstabla („najdešnji“ čvor od čvorova J, B i L u postorder) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 17
Zadatak 3 - rešenje inorder: JBL A EDKCHFGI postorder: JLBEKDHIGFCA Postupak: - iz inorder poretka zaključujemo da su čvorovi J i L respektivno u levom i desnom podstablu čvora B - slično, EDK su u levom podstablu C i u postorder obilasku poslednji od njih je D on je koren levog podstabla C - HFGI su u desnom podstablu C, pri čemu je F „najdešnji“ po postorder, dakle F je koren desnog podstabla C Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 18
Zadatak 3 - rešenje inorder: JBL A EDK C HFGI postorder: JLBEKDHIGFCA Postupak: - iz inorder poretka zaključujemo da su čvorovi E i K respektivno u levom i desnom podstablu čvora D - slično, H je u levi sin čvora F, čvorovi GI su u desnom podstablu - čvor G je „dešnji“, pa je on koren desnog podstabla F, a iz inorder dalje vidimo da je I njegov desni sin Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 19
Zadatak 3 - rešenje inorder: JBLAEDKCHFGI postorder: JLBEKDHIGFCA Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 20
Zadatak 4 Napisati proceduru koja prikazuje iterativnu realizaciju inorder obilaska binarnog stabla. Kako bi izgledala rekurzivna varijanta? INORDER-R(root) INORDER-R( left(root) ) P(root) INORDER-R( right(root) ) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop 21
Zadatak 5 Skicirati i objasniti iterativnu realizaciju inorder algoritma obilaska binarnog stabla. Ilustrovati rad algoritma po koracima na primeru sledećeg stabla. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 22
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else next return end_if end_loop Elektrotehnički fakultet, Beograd next stack inorder poredak A Algoritmi i Strukture Podataka 23
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else next return end_if end_loop Elektrotehnički fakultet, Beograd next A stack A inorder poredak - B Algoritmi i Strukture Podataka 24
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B A AB - D Algoritmi i Strukture Podataka 25
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D AB ABD - nil next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 26
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil ABD next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 27
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil ABD AB next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 28
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 29
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 30
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 31
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 32
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 33
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A D Algoritmi i Strukture Podataka 34
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB Algoritmi i Strukture Podataka 35
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 36
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E A DB next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 37
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 38
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 39
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AE DB next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 40
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 41
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, next Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil Algoritmi i Strukture Podataka 42
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, next Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AEG DB Algoritmi i Strukture Podataka 43
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, next Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AEG DB Algoritmi i Strukture Podataka 44
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DB next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 45
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 46
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil next. Algoritmi i Strukture Podataka 47
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG next. Algoritmi i Strukture Podataka 48
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG next. Algoritmi i Strukture Podataka 49
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DB nil A DBG next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 50
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 51
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 52
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 53
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 54
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else next return end_if end_loop Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil Algoritmi i Strukture Podataka DBGE 55
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else next return end_if end_loop Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil Algoritmi i Strukture Podataka DBGEA 56
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, Beograd next inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil next stack DBGEA C Algoritmi i Strukture Podataka 57
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, Beograd next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil DBGEA C DBGEA Algoritmi i Strukture Podataka 58
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop Elektrotehnički fakultet, Beograd next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil next inorder poredak C Algoritmi i Strukture Podataka DBGEA C DBGEA 59
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA nil next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 60
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil DBGEA C C DBGEA nil C DBGEA next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 61
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil DBGEA C C DBGEA nil C DBGEA next Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 62
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil next inorder poredak A C nil Elektrotehnički fakultet, Beograd stack Algoritmi i Strukture Podataka DBGEA C DBGEA 63
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil next inorder poredak A C nil Elektrotehnički fakultet, Beograd stack Algoritmi i Strukture Podataka DBGEA C DBGEAC 64
Zadatak 5 - rešenje next INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C next inorder poredak A nil Elektrotehnički fakultet, Beograd stack DBGEA C DBGEAC F Algoritmi i Strukture Podataka 65
Zadatak 5 - rešenje next INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop inorder poredak A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C next Elektrotehnički fakultet, Beograd stack DBGEA C DBGEA nil DBGEAC F DBGEAC Algoritmi i Strukture Podataka 66
Zadatak 5 - rešenje next INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil next Elektrotehnički fakultet, Beograd inorder poredak F Algoritmi i Strukture Podataka DBGEAC F DBGEAC 67
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil F next Elektrotehnički fakultet, Beograd inorder poredak DBGEAC F DBGEAC nil Algoritmi i Strukture Podataka 68
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil next Elektrotehnički fakultet, Beograd inorder poredak DBGEAC F F DBGEAC nil F DBGEAC Algoritmi i Strukture Podataka 69
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil next Elektrotehnički fakultet, Beograd inorder poredak DBGEAC F F DBGEAC nil F DBGEAC Algoritmi i Strukture Podataka 70
Zadatak 5 - rešenje next INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil next F nil Elektrotehnički fakultet, Beograd inorder poredak Algoritmi i Strukture Podataka DBGEAC F DBGEAC 71
Zadatak 5 - rešenje next INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil next F nil Elektrotehnički fakultet, Beograd inorder poredak Algoritmi i Strukture Podataka DBGEAC F DBGEACF 72
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil F next Elektrotehnički fakultet, Beograd inorder poredak nil DBGEAC F DBGEACF nil Algoritmi i Strukture Podataka 73
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil F next Elektrotehnički fakultet, Beograd inorder poredak DBGEAC F DBGEAC nil DBGEACF Algoritmi i Strukture Podataka 74
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil F next Elektrotehnički fakultet, Beograd inorder poredak DBGEAC F DBGEAC nil DBGEACF Algoritmi i Strukture Podataka 75
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil F next Elektrotehnički fakultet, Beograd inorder poredak DBGEAC F DBGEAC nil DBGEACF Algoritmi i Strukture Podataka 76
Zadatak 5 - rešenje INORDER-I(root) next = root loop while (next nil) do PUSH(S, next) next = left(next) end_while if (not STACK-EMPTY(S)) then next = POP(S) P(next) next = right(next) else return end_if end_loop next stack A A - B AB - D ABD - nil AB D nil A DB E AE DB G AEG DB nil AE DBG nil A DBGE nil C DBGEA C nil F Elektrotehnički fakultet, Beograd inorder poredak DBGEAC F DBGEAC nil DBGEACF Algoritmi i Strukture Podataka 77
Zadatak 6 Za dato binarno stablo napisati funkciju koja vraća celobrojnu vrednost koja predstavlja širinu stabla. Funkciji je prosleđen pokazivač na koren stabla. Širina nivoa je 1 Širina nivoa je 2 Širina nivoa je 3 Maksimalna širina je 3 što je i širina celog stabla. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 78
Zadatak 6 - rešenje • Iterativno rešenje TREE_WIDTH (root) if root = nil then return 0 end_if INIT_QUEUE(Q) node = root max_width = 0 curr_width = 0 INSERT(Q, node) INSERT(Q, nil) //graničnik Elektrotehnički fakultet, Beograd while (FRONT(Q) nil ) do node = DELETE(Q) curr_width++ if left(node) nil then INSERT(Q, left(node)) end_if if right(node) nil then INSERT(Q, right(node)) end_if if FRONT(Q) = nil then INSERT(Q, nil) DELETE(Q) // brisanje nil if curr_width > max_width then max_width = curr_width end_if curr_width = 0 end_if end_while DELETE(Q) // brisanje nil return max_width Algoritmi i Strukture Podataka 79
Zadatak 6 - rešenje • Bez graničnika TREE_WIDTH (root) if root = nil then return 0 end_if max_width = 0 INIT_QUEUE(Q) INSERT(Q, root) curr_width = 1 Elektrotehnički fakultet, Beograd while (not QUEUE-EMPTY(Q)) do next_width = 0 while curr_width > 0 do begin curr_width = curr_width - 1 next = DELETE(Q) if left(next) nil then INSERT(Q, left(next)) next_width = next_width + 1 end_if if right(next) nil then INSERT(Q, right(next)) next_width = next_width + 1 end_if end_while if next_width > max_width then max_width = next_width end_if curr_width = next_width end_while return max_width Algoritmi i Strukture Podataka 80
Zadatak 7 Za binarno stablo dato pokazivačem na koren root napisati iterativnu funkciju koja efikasno vraća k-ti čvor po preorder obilasku. Dozvoljeno je proširiti čvor stabla jednim poljem. Ideja: u čvoru stabla čuvati i informaciju o tome koliko ima čvorova u levom podstablu - lc. U zavisnosti od toga da li u levom podstablu ima više od k čvorova ili ne prelazimo u levo ili desno podstablo, respektivno, i dalje tražimo k-ti čvor. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 81
Zadatak 7 - rešenje PREORDER-K(root, k) temp = root while temp nil then if k = 1 then return temp end_if if lc(temp) + 1 >= k then temp = left(temp) k=k-1 else k = k - lc(temp) - 1 temp = right(temp) end_if end_while return nil Za vežbu: Naći k-ti element po inorder obilasku. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 82
Zadatak 8 Dato je binarno stablo koje sadrži cele brojeve. Napisati u pseudokodu iterativnu implementaciju funkcije koja na osnovu zadatog stabla na čiji koren pokazuje pokazivač root formira simetrično stablo. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 83
Zadatak 8 - rešenje • Rekurzivno rešenje CREATE_MIRROR_TREE(root) if root nil then node = GETNODE info(node) = info(root) left(node) = CREATE_MIRROR_TREE(right(root)) right(node) = CREATE_MIRROR_TREE(left(root)) return node else return nil end_if Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 84
Zadatak 8 - rešenje • Iterativno rešenje COPYNODE(node) if node = nil then return nil end_if res = GETNODE info(res) = info(node) left(res) = left(node) right(res) = right(node) return res Elektrotehnički fakultet, Beograd CREATE_MIRROR_TREE(root) if root = nil then return nil end_if INIT_STACK(S) res = COPYNODE(root) PUSH(S, res) while (not STACK-EMPTY(S)) do next = POP(S) left = left(next) right = right(next) = COPYNODE(left) left(next) = COPYNODE(right) if left(next) nil then PUSH(S, left(next)) end_if if right(next) nil then PUSH(S, right(next)) end_if end_while return res Algoritmi i Strukture Podataka 85
- Slides: 85