|
@ -1,5 +1,6 @@ |
|
|
from django.core.exceptions import ObjectDoesNotExist |
|
|
from django.core.exceptions import ObjectDoesNotExist |
|
|
# NOTE: node.prev a node.succ jsou implementovány přímo v models.TreeNode |
|
|
# NOTE: node.prev a node.succ jsou implementovány přímo v models.TreeNode |
|
|
|
|
|
# TODO: Všechny tyto funkce se naivně spoléhají na to, že jako parametr dostanou nějaký TreeNode (některé možná zvládnou i None) |
|
|
|
|
|
|
|
|
# Slouží k debugování pro rychlé získání představy o podobě podstromu pod tímto TreeNode. |
|
|
# Slouží k debugování pro rychlé získání představy o podobě podstromu pod tímto TreeNode. |
|
|
def print_tree(node,indent=0): |
|
|
def print_tree(node,indent=0): |
|
@ -44,13 +45,38 @@ def general_next(node): |
|
|
return None # žádný z předků nemá následníka, takže žádny vrchol nenásleduje. |
|
|
return None # žádný z předků nemá následníka, takže žádny vrchol nenásleduje. |
|
|
return node.succ |
|
|
return node.succ |
|
|
|
|
|
|
|
|
|
|
|
def last_brother(node): |
|
|
|
|
|
while node.succ is not None: |
|
|
|
|
|
node = node.succ |
|
|
|
|
|
return node |
|
|
|
|
|
|
|
|
def general_prev(node): |
|
|
def general_prev(node): |
|
|
pass |
|
|
# Předchůdce je buď rekurzivně poslední potomek předchůdce, nebo náš otec. |
|
|
|
|
|
# Otce vyřešíme nejdřív: |
|
|
|
|
|
if safe_pred(node) is None: |
|
|
|
|
|
return safe_father_of_first(node) |
|
|
|
|
|
pred = safe_pred(node) |
|
|
|
|
|
while pred.first_child is not None: |
|
|
|
|
|
pred = last_brother(pred.first_child) |
|
|
|
|
|
# pred nyní nemá žádné potomky, takže je to poslední rekurzivní potomek původního předchůdce |
|
|
|
|
|
return pred |
|
|
|
|
|
|
|
|
# Generátor potomků |
|
|
# Generátor potomků |
|
|
# TODO: copy-pasta |
|
|
# TODO: copy-pasta |
|
|
|
|
|
|
|
|
# Generátor bratrů |
|
|
# Generátor bratrů |
|
|
|
|
|
# Generátor potomků níže spoléhá na to, že se tohle dá volat i s parametrem None. |
|
|
|
|
|
def all_brothers(node): |
|
|
|
|
|
current = node |
|
|
|
|
|
while current is not None: |
|
|
|
|
|
yield current |
|
|
|
|
|
current = current.succ |
|
|
|
|
|
|
|
|
|
|
|
# Generátor potomků |
|
|
|
|
|
def all_children(node): |
|
|
|
|
|
brothers = all_brothers(node.first_child) |
|
|
|
|
|
for br in brothers: |
|
|
|
|
|
yield br |
|
|
|
|
|
|
|
|
# Generátor následníků v "the-right-order" |
|
|
# Generátor následníků v "the-right-order" |
|
|
|
|
|
|
|
|