From 0323b46113de435d86a7d0803d57f78ce700e6f4 Mon Sep 17 00:00:00 2001
From: Pavel 'LEdoian' Turinsky <ledoian@matfyz.cz>
Date: Wed, 11 Mar 2020 23:34:36 +0100
Subject: [PATCH] =?UTF-8?q?TreeLib:=20hleda=C4=8D=20pre-order=20p=C5=99edc?=
 =?UTF-8?q?h=C5=AFdc=C5=AF,=20gener=C3=A1tor=20bratr=C5=AF=20a=20potomk?=
 =?UTF-8?q?=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"