# 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... # ... a z prvního potomka umíme najít rodiče # Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé) def general_next(node): pass 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