From 989e998e03d491f663771e8890af56aab90b22a5 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 11 Mar 2020 21:30:00 +0100 Subject: [PATCH 1/5] Treelib: get_parent --- seminar/treelib.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/seminar/treelib.py b/seminar/treelib.py index bf696545..fa2f7807 100644 --- a/seminar/treelib.py +++ b/seminar/treelib.py @@ -1,3 +1,4 @@ +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. @@ -13,8 +14,19 @@ def print_tree(node,indent=0): 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): From 9efb684cc1c1e15c2f4f66eac3762024d92464f1 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 11 Mar 2020 21:39:26 +0100 Subject: [PATCH 2/5] Treelib: general_next --- seminar/treelib.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/seminar/treelib.py b/seminar/treelib.py index fa2f7807..ce956219 100644 --- a/seminar/treelib.py +++ b/seminar/treelib.py @@ -30,7 +30,17 @@ def get_parent(node): # Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé) def general_next(node): - pass + # 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 From 9a0664f6c2fd1d3376c027eaf87592242c806e12 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 11 Mar 2020 23:07:58 +0100 Subject: [PATCH 3/5] =?UTF-8?q?TreeLib:=20Bezpe=C4=8Dn=C3=A9=20varianty=20?= =?UTF-8?q?.pred=20a=20.father=5Fof=5Ffirst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/treelib.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/seminar/treelib.py b/seminar/treelib.py index ce956219..b2b106b2 100644 --- a/seminar/treelib.py +++ b/seminar/treelib.py @@ -10,23 +10,26 @@ def print_tree(node,indent=0): if node.succ: print_tree(node.succ, indent=indent) +# Django je trošku hloupé, takže node.prev nevrací None, ale hází django.core.exceptions.ObjectDoesNotExist +def safe_pred(node): + try: + return node.prev + except ObjectDoesNotExist: + return None + +# A to samé pro .father_of_first +def safe_father_of_first(node): + return node.prev + except ObjectDoesNotExist: + return None + ## 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 + while safe_pred(node) is not None: + node = safe_pred(node) # ... 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 + return safe_father_of_first(node) # Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé) def general_next(node): From 0323b46113de435d86a7d0803d57f78ce700e6f4 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 11 Mar 2020 23:34:36 +0100 Subject: [PATCH 4/5] =?UTF-8?q?TreeLib:=20hleda=C4=8D=20pre-order=20p?= =?UTF-8?q?=C5=99edch=C5=AFdc=C5=AF,=20gener=C3=A1tor=20bratr=C5=AF=20a=20?= =?UTF-8?q?potomk=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/treelib.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/seminar/treelib.py b/seminar/treelib.py index b2b106b2..2b7699a0 100644 --- a/seminar/treelib.py +++ b/seminar/treelib.py @@ -1,5 +1,6 @@ from django.core.exceptions import ObjectDoesNotExist # 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. 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 node.succ +def last_brother(node): + while node.succ is not None: + node = node.succ + return 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ů # TODO: copy-pasta # 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" From 007774c81b04c6236dbd1aaf1813a5859931f040 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 11 Mar 2020 23:44:50 +0100 Subject: [PATCH 5/5] =?UTF-8?q?TreeLib:=20Smaz=C3=A1n=20zapomenut=C3=BD=20?= =?UTF-8?q?koment=C3=A1=C5=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Napálil jsem se při přidávání věcí přes Vimový plugin :-) --- seminar/treelib.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/seminar/treelib.py b/seminar/treelib.py index 2b7699a0..cfb49d86 100644 --- a/seminar/treelib.py +++ b/seminar/treelib.py @@ -61,9 +61,6 @@ def general_prev(node): # pred nyní nemá žádné potomky, takže je to poslední rekurzivní potomek původního předchůdce return pred -# Generátor potomků -# TODO: copy-pasta - # 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):