Avec des références mères
Si vous configurez chaque nœud afin qu'il ait une référence à son parent, vous pouvez juste trouver le plus profond nœud et ensuite revenir de là à la racine de l'arbre en traçant à travers les parents. C'est sans aucun doute la chose la plus facile à faire au détriment d'avoir un supplément parentNodevariable de référence dans chaque noeud.
# Iterate through parents to trace the path in reverse.
node = deepestNode(tree)
while node.parent != None:
node = node.parent
Sans références mères
Si vous ne disposez pas de références mères, vous pouvez garder une trace du chemin depuis la racine de l'arbre au nœud « courant » que vous RECURSE à travers l'arbre. Chaque fois que vous toucher le fond, sauf ce chemin comme « le plus long chemin jusqu'à présent » si le chemin est plus long que votre précédent « plus long chemin jusqu'à présent ». En effet cela signifie rendre votre pile d'appel explicite.
Voici un code Python-ish:
# Public function. Sets up globals and then calls helper.
def deepestPath(tree):
global longestPath, currentPath
# Reset for a new search.
longestPath = []
currentPath = []
_deepestPath(tree.root)
return longestPath
# Helper function that does the real work.
def _deepestPath(node):
global longestPath, currentPath
currentPath.append(node)
# No children, we've bottomed out.
if not node.left and not node.right:
if currentPath.length > longestPath.length:
# Save a copy of the current path.
longestPath = list(currentPath)
# Recurse into children.
else:
if node.left: _deepestPath(node.left)
if node.right: _deepestPath(node.right)
currentPath.pop(node)