TreeLib: hledač pre-order předchůdců, generátor bratrů a potomků
This commit is contained in:
		
							parent
							
								
									9a0664f6c2
								
							
						
					
					
						commit
						0323b46113
					
				
					 1 changed files with 27 additions and 1 deletions
				
			
		|  | @ -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" | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Pavel 'LEdoian' Turinsky
						Pavel 'LEdoian' Turinsky