from django.core.exceptions import ObjectDoesNotExist # NOTE: node.prev a node.succ jsou implementovány přímo v models.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): # FIXME: Tady se spoléháme na to, že nedeklarovaný primární klíč se jmenuje by default 'id', což není úplně správně print("{}{} (id: {})".format(" "*indent,node, node.id)) if node.first_child: print_tree(node.first_child, indent=indent+2) if node.succ: print_tree(node.succ, indent=indent) ## Rodinné vztahy def get_parent(node): pass # Nejdřív získáme prvního potomka... # Django je trošku hloupé, takže node.prev nevrací None, ale hází django.core.exceptions.ObjectDoesNotExist while True: try: node = node.prev except ObjectDoesNotExist: # We rely here on the fact that the assignment will not happen if RHS throws an exception break # ... a z prvního potomka umíme najít rodiče # Django je pořád hloupé... try: return node.father_of_first except ObjectDoesNotExist: return None # Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé) def general_next(node): # Máme potomka? if node.first_child is not None: return node.first_child # Nemáme potomka. # Chceme najít následníka sebe, nebo některého (toho nejblíž příbuzného) z našich předků (tatínka, dědečka, ...) while node.succ is None: node = get_parent(node) if node is None: return None # žádný z předků nemá následníka, takže žádny vrchol nenásleduje. return node.succ def general_prev(node): pass # Generátor potomků # TODO: copy-pasta # Generátor bratrů # Generátor následníků v "the-right-order" ## Filtrační hledání # Najdi dalšího bratra nějakého typu, nebo None. # hledá i podtřídy, i.e. get_next_brother_of_type(neco, TreeNode) je prostě succ. def get_next_brother_of_type(current, type): pass def get_prev_brother_of_type(current, type): pass # Totéž pro "the-right-order" pořadí def get_next_node_of_type(current, type): pass def get_next_node_of_type(current, type): pass # Editace stromu: def create_node_after(predecessor, type, **kwargs): pass # Vyrábí prvního syna, ostatní nalepí za (existují-li) def create_child(parent, type, **kwargs): pass def create_node_before(some, arguments, but, i, dont, know, which, yet): pass # Tohle bude hell. # ValueError, pokud je (aspoň) jeden parametr None def swap(node, other): pass def swap_pred(node): pass def swap_succ(node): pass # Rotace stromu # Dokumentace viz wiki: # (lower bude jednoduchá rotace, ne mega, existence jednoduché rotace mi došla až po nakreslení obrázku) def raise_node(node): pass def lower_node(node): pass