Given a binary tree, the task is to print the longest path from the root node to the leaf node. If there are multiple answers print any one of them.
Examples:
Input:
4
/ \
3 6
/ \
5 7
Output:
4 -> 6 -> 7
Explanation:
Longest paths from root to leaf
are (4 -> 6 -> 5)
and (4 -> 6 -> 7).
Print any of them.
Input:
1
/ \
2 3
/ \
4 5
\
6
Output:
1 -> 2 -> 5 -> 6
Naive Approach: The idea is to generate all possible paths from the root node to all leaf nodes, keep track of the path with maximum length, finally print the longest path.
Time Complexity: O(N2)
Efficient Approach: The idea is to use Recursion to solve this problem efficiently. The main idea is to recursively get the longest path from the left subtree and right subtree then add the current node to one which has a greater length and it will be the longest path from the current node to leaf. Starting with the root node, follow the steps below for each node called recursively.
- If the root node is null then no path exists, return an empty vector.
- Get the longest path from right subtree in a vector rightvect by recursively traversing root -> right.
- Similarly, get the longest path from left subtree in a vector leftvect by recursively traversing root -> left.
- Compare the length of rightvect and leftvect and append the current node to the longer of the two and return that vector.
By following the above steps, the vector obtained at the end of the tree traversal is the longest path possible. Print the vector in reverse as the longest path from the root to leaf.
Look at this image to understand how the longest paths from the nodes of left and right subtree are used to obtain the longest path from the current node:

Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node *left, *right;
};
struct Node* newNode( int data)
{
struct Node* node = new Node;
node->data = data;
node->left = node->right = NULL;
return (node);
}
vector< int > longestPath(Node* root)
{
if (root == NULL) {
vector< int > temp
= {};
return temp;
}
vector< int > rightvect
= longestPath(root->right);
vector< int > leftvect
= longestPath(root->left);
if (leftvect.size() > rightvect.size())
leftvect.push_back(root->data);
else
rightvect.push_back(root->data);
return (leftvect.size() > rightvect.size()
? leftvect
: rightvect);
}
int main()
{
struct Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->left->right->right = newNode(6);
vector< int > output = longestPath(root);
int n = output.size();
cout << output[n - 1];
for ( int i = n - 2; i >= 0; i--) {
cout << " -> " << output[i];
}
return 0;
}
|
Java
import java.io.*;
import java.util.ArrayList;
class GFG{
static class Node
{
Node left;
Node right;
int data;
};
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.left = null ;
temp.right = null ;
return temp;
}
public static ArrayList<Integer> longestPath(Node root)
{
if (root == null )
{
ArrayList<Integer> output = new ArrayList<>();
return output;
}
ArrayList<Integer> right = longestPath(root.right);
ArrayList<Integer> left = longestPath(root.left);
if (right.size() < left.size())
{
left.add(root.data);
}
else
{
right.add(root.data);
}
return (left.size() >
right.size() ? left :right);
}
public static void main(String[] args)
{
Node root = newNode( 1 );
root.left = newNode( 2 );
root.right = newNode( 3 );
root.left.left = newNode( 4 );
root.left.right = newNode( 5 );
root.left.right.right = newNode( 6 );
ArrayList<Integer> output = longestPath(root);
int n = output.size();
System.out.print(output.get(n - 1 ));
for ( int i = n - 2 ; i >= 0 ; i--)
{
System.out.print( " -> " + output.get(i));
}
}
}
|
Python3
class Node:
def __init__( self , key):
self .data = key
self .left = None
self .right = None
def longestPath(root):
if (root = = None ):
return []
rightvect = longestPath(root.right)
leftvect = longestPath(root.left)
if ( len (leftvect) > len (rightvect)):
leftvect.append(root.data)
else :
rightvect.append(root.data)
if len (leftvect) > len (rightvect):
return leftvect
return rightvect
if __name__ = = '__main__' :
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.left.right = Node( 5 )
root.left.right.right = Node( 6 )
output = longestPath(root)
n = len (output)
print (output[n - 1 ], end = "")
for i in range (n - 2 , - 1 , - 1 ):
print ( " ->" , output[i], end = "")
|
C#
using System;
using System.Collections.Generic;
class GFG{
class Node
{
public Node left;
public Node right;
public int data;
};
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.left = null ;
temp.right = null ;
return temp;
}
static List< int > longestPath(Node root)
{
if (root == null )
{
List< int > output = new List< int >();
return output;
}
List< int > right = longestPath(root.right);
List< int > left = longestPath(root.left);
if (right.Count < left.Count)
{
left.Add(root.data);
}
else
{
right.Add(root.data);
}
return (left.Count >
right.Count ?
left :right);
}
public static void Main(String[] args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.left.right.right = newNode(6);
List< int > output = longestPath(root);
int n = output.Count;
Console.Write(output[n - 1]);
for ( int i = n - 2; i >= 0; i--)
{
Console.Write( " -> " + output[i]);
}
}
}
|
Javascript
<script>
class Node
{
constructor(data)
{
this .data = data;
this .left = this .right = null ;
}
}
function longestPath(root)
{
if (root == null )
{
let output = [];
return output;
}
let right = longestPath(root.right);
let left = longestPath(root.left);
if (right.length < left.length)
{
left.push(root.data);
}
else
{
right.push(root.data);
}
return (left.length >
right.length ? left :right);
}
let root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
root.left.right.right = new Node(6);
let output = longestPath(root);
let n = output.length;
document.write(output[n - 1]);
for (let i = n - 2; i >= 0; i--)
{
document.write( " -> " + output[i]);
}
</script>
|
Time complexity: O(N)
Auxiliary Space: O(N)