Con referencias de padres
Si configura cada nodo para que tenga una referencia a su elemento primario, puede encontrar el nodo más profundo y luego retroceder desde allí a la raíz del árbol rastreando a través de los padres. Eso definitivamente es lo más fácil de hacer a expensas de tener una parentNodevariable de referencia adicional en cada nodo.
# Iterate through parents to trace the path in reverse.
node = deepestNode(tree)
while node.parent != None:
node = node.parent
Sin referencias de padres
Si no tiene referencias parentales, puede hacer un seguimiento de la ruta desde la raíz del árbol hasta el nodo "actual" a medida que recurre a través del árbol. Siempre que toques fondo, guarda esa ruta como la "ruta más larga hasta el momento" si la ruta es más larga que tu "ruta más larga hasta el momento". Efectivamente eso significa hacer explícita su pila de llamadas.
Aquí hay un código 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)