АСП1/К2 2016 — разлика између измена
м (Mislim da bi imalo smisla da objašnjenje ide pre koda; ispravke u označavanju sintakse; uvlačenje sa četiri razmaka) |
|||
Ред 30: | Ред 30: | ||
Rešenje se sastoji od toga da se vratimo unazad, pamteći put, i onda silazimo opet ali obrnutim putem. Ukoliko se isprazni stek, to znači da postoji simetrični član. | Rešenje se sastoji od toga da se vratimo unazad, pamteći put, i onda silazimo opet ali obrnutim putem. Ukoliko se isprazni stek, to znači da postoji simetrični član. | ||
<u>CHECK_SYMMETRIC(''root'', ''node'')</u> | <u>CHECK_SYMMETRIC(''root'', ''node'')</u> | ||
'' | ''path'' = nil | ||
'''while''' ''node'' ≠ ''root'' '''do''' | '''while''' ''node'' ≠ ''root'' '''do''' | ||
''step'' = GETNODE | |||
''parent'' = ''parent''(''node'') | ''parent'' = ''parent''(''node'') | ||
'''if''' ''left''(''parent'') = ''node'' '''then''' | '''if''' ''left''(''parent'') = ''node'' '''then''' | ||
info(''step'') = 0 | |||
'''else''' | '''else''' | ||
info(''step'') = 1 | |||
'''end_if''' | '''end_if''' | ||
''node'' = ''parent'' | ''node'' = ''parent'' | ||
next(''step'') = ''path'' | |||
''path'' = ''step'' | |||
'''end_while''' | '''end_while''' | ||
'''while''' ''node'' ≠ nil '''do''' | '''while''' ''node'' ≠ nil '''do''' | ||
'''if''' | '''if''' ''path'' = nil '''then''' | ||
'''return''' true | '''return''' true | ||
'''end_if''' | '''end_if''' | ||
'''if''' | '''if''' info(''path'') = 0 '''then''' | ||
''node'' = ''right''(''node'') | ''node'' = ''right''(''node'') | ||
'''else''' | '''else''' | ||
''node'' = ''left''(''node'') | ''node'' = ''left''(''node'') | ||
'''end_if''' | '''end_if''' | ||
''step'' = ''path'' | |||
''path'' = next(''path'') | |||
FREE(''step'') | |||
'''end_while''' | '''end_while''' | ||
'''return''' false | '''return''' false |
Верзија на датум 5. април 2020. у 15:55
1. zadatak
Postavka
Na slici je dato jedno nekompletno prikazano binarno stablo (desno. Ukoliko preorder obilazak takvog stabla daje poredak čvorova ACBDFE, nacrtati sve moguće izglede ovog stabla.
A / \ C ... \ B
Rešenje
Pogledajmo najpre obilazak A CB DFE
Levi deo je kompletan i D mora biti koren desnog podstabla. Odatle dolaze kombinacije:
A A A A A / \ / \ / \ / \ / \ C D C D C D C D C D \ / \ \ / \ / \ \ \ \ B F E B F B F B F B F / \ \ / E E E E
2. zadatak
Postavka
Napisati u pseudokodu funkciju koja u binarnom stablu na čiji koren pokazuje pokazivač root utvrđuje da li postoji čvor čija pozicija u stablu (u odnosu na koren) je simetrična u odnosu na poziciju čvora na koji pokazuje pokazivač node. Smatrati da svaki čvor binarnog stabla pored informacionog sadržaja sadrži pokazivače na levo i desno podstablo i pokazivač na roditeljski čvor.
Rešenje
Rešenje se sastoji od toga da se vratimo unazad, pamteći put, i onda silazimo opet ali obrnutim putem. Ukoliko se isprazni stek, to znači da postoji simetrični član.
CHECK_SYMMETRIC(root, node) path = nil while node ≠ root do step = GETNODE parent = parent(node) if left(parent) = node then info(step) = 0 else info(step) = 1 end_if node = parent next(step) = path path = step end_while while node ≠ nil do if path = nil then return true end_if if info(path) = 0 then node = right(node) else node = left(node) end_if step = path path = next(path) FREE(step) end_while return false