Cu referințe părinte
Dacă configurați fiecare nod , astfel încât acesta are o trimitere la părintele său, puteți găsi doar cel mai adânc nod și apoi de mers înapoi de acolo la rădăcina copacului prin trasarea prin părinți. Aceasta este cu siguranță cel mai ușor lucru de făcut în detrimentul de a avea un plus de parentNodevariabilă de referință în fiecare nod.
# Iterate through parents to trace the path in reverse.
node = deepestNode(tree)
while node.parent != None:
node = node.parent
Fără referințe părinte
Dacă nu aveți referințe părinte, atunci puteți urmări calea de la rădăcina arborelui la nodul „curent“, în timp ce recurse prin copac. De fiecare dată când fund, salvați această cale ca fiind „cea mai lungă calea de până acum“, în cazul în care calea este mai lung decât precedenta dvs. „cea mai lungă cale până acum“. Efectiv, care înseamnă a face stiva apel explicit.
Iată un exemplu de cod 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)