# 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: node.first_child.print_tree(indent=indent+2) if node.succ: node.succ.print_tree(indent=indent) ## Rodinné vztahy def get_parent(node): # 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) def general_prev(node) # 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): def get_prev_brother_of_type(current, type): # Totéž pro "the-right-order" pořadí def get_next_node_of_type(current, type): def get_next_node_of_type(current, type): # Editace stromu: def create_node_after(predecessor, type, **kwargs): # Vyrábí prvního syna, ostatní nalepí za (existují-li) def create_child(parent, type, **kwargs): def create_node_before(...): # Tohle bude hell. # ValueError, pokud je (aspoň) jeden parametr None def swap(node, other): def swap_pred def swap_succ # 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) def lower(node)