Con riferimenti genitore
Se si configurare ogni nodo in modo che abbia un riferimento al suo genitore, si può solo trovare il nodo più profonda e poi tornare a piedi da lì alla radice dell'albero tracciando attraverso i genitori. Questa è sicuramente la cosa più semplice da fare, a scapito di avere un extra parentNodevariabile di riferimento in ciascun nodo.
# Iterate through parents to trace the path in reverse.
node = deepestNode(tree)
while node.parent != None:
node = node.parent
Senza riferimenti genitore
Se non si dispone di riferimenti genitore, quindi è possibile tenere traccia del percorso dalla radice dell'albero al nodo "corrente", come si ricorsione attraverso l'albero. Ogni volta che il fondo, salvo che il percorso come il "percorso più lungo finora" se il percorso è più lungo di una precedente "percorso più lungo finora". Effettivamente questo significa rendere il vostro stack di chiamata esplicita.
Ecco alcuni codice 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)