Given a root of the Binary Tree and head of the Linked List, the task is to check if all the elements of the linked list corresponds to a downward path from any node in the given Binary Tree.
Examples:
Input: Tree in the image below, list = {3, 6, 8}

Output: Yes Explanation: There exists a downward path in the given Binary Tree, having all the elements of the linked list in the same order.
Input: Tree in the image below, list = {1, 2, 5, 7}

Output: Yes
Approach: The given problem can be solved with the help of the DFS Traversal of the Binary tree. During the DFS traversal, if any node of the Binary Tree is equal to the head of the linked list, a recursive function isPathUntil() can be called to recursively check whether the other elements of the linked list also exist as a path from that node. If the complete linked list has been traversed, there exists a valid required path, hence return true. Otherwise, return false. Follow the steps below to solve the given problem:
- Declare a function, say isSubPathUtil(root, head) , and perform the following steps in this function:
- If the root is NULL, then return false.
- If the head is NULL, then return true.
- If the value of the current root node is the same as the value of the current head of LL, then recursively call for isSubPathUtil(root->left, head->next) and isSubPathUtil(root->right, head->next) and if the value returned one of these recursive calls is true, then return true. Otherwise, return false.
- Declare a function, say isSubPath(root, head), and perform the following steps in this function:
- If the root is NULL, then return false.
- If the head is NULL, then return true.
- If the value of the current root node is the same as the value of the current head of LL, then recursively call for isSubPath(root->left, head->next) and isSubPath(root->right, head->next) and if the value returned one of these recursive calls is true, then return true. Otherwise, return value call recursively for isSubPath(root->left, head) and isSubPath(root->right, head).
- After the above steps, if the value returned by the function isSubPath(root, head) is true , then print Yes . Otherwise, print No .
Below is the implementation of the above approach:
C++
#include "bits/stdc++.h"
using namespace std;
struct listNode {
int val;
struct listNode* next;
listNode( int data)
{
this ->val = data;
next = NULL;
}
};
struct treeNode {
int val;
treeNode* right;
treeNode* left;
treeNode( int data)
{
this ->val = data;
this ->left = NULL;
this ->right = NULL;
}
};
bool isPathUtil(listNode* curList,
treeNode* curTree)
{
if (curList == NULL)
return true ;
if (curTree == NULL)
return false ;
if (curList->val == curTree->val) {
return isPathUtil(curList->next,
curTree->left)
|| isPathUtil(curList->next,
curTree->right);
}
else {
return false ;
}
}
bool isPath(listNode* head, treeNode* root)
{
if (root == NULL)
return false ;
if (head == NULL)
return true ;
bool isPossible = false ;
if (root->val == head->val) {
isPossible = isPathUtil(
head->next, root->left)
|| isPathUtil(
head->next, root->right);
}
return isPossible || isPath(head, root->left)
|| isPath(head, root->right);
}
int main()
{
treeNode* root = new treeNode(1);
root->left = new treeNode(2);
root->right = new treeNode(3);
root->left->left = new treeNode(4);
root->left->right = new treeNode(5);
root->left->right->left = new treeNode(7);
root->right->right = new treeNode(6);
root->right->right->left = new treeNode(8);
root->right->right->right = new treeNode(9);
listNode* head = new listNode(3);
head->next = new listNode(6);
head->next->next = new listNode(8);
cout << (isPath(head, root) ? "Yes" : "No" );
return 0;
}
|
Java
import java.util.*;
public class GFG{
static class listNode {
int val;
listNode next;
listNode( int data)
{
this .val = data;
next = null ;
}
};
static class treeNode {
int val;
treeNode right;
treeNode left;
treeNode( int data)
{
this .val = data;
this .left = null ;
this .right = null ;
}
};
static boolean isPathUtil(listNode curList,
treeNode curTree)
{
if (curList == null )
return true ;
if (curTree == null )
return false ;
if (curList.val == curTree.val) {
return isPathUtil(curList.next,
curTree.left)
|| isPathUtil(curList.next,
curTree.right);
}
else {
return false ;
}
}
static boolean isPath(listNode head, treeNode root)
{
if (root == null )
return false ;
if (head == null )
return true ;
boolean isPossible = false ;
if (root.val == head.val) {
isPossible = isPathUtil(
head.next, root.left)
|| isPathUtil(
head.next, root.right);
}
return isPossible || isPath(head, root.left)
|| isPath(head, root.right);
}
public static void main(String[] args)
{
treeNode root = new treeNode( 1 );
root.left = new treeNode( 2 );
root.right = new treeNode( 3 );
root.left.left = new treeNode( 4 );
root.left.right = new treeNode( 5 );
root.left.right.left = new treeNode( 7 );
root.right.right = new treeNode( 6 );
root.right.right.left = new treeNode( 8 );
root.right.right.right = new treeNode( 9 );
listNode head = new listNode( 3 );
head.next = new listNode( 6 );
head.next.next = new listNode( 8 );
System.out.print((isPath(head, root) ? "Yes" : "No" ));
}
}
|
Python3
class listNode:
def __init__ ( self , data):
self .val = data;
self . next = None ;
class treeNode:
def __init__ ( self , data):
self .val = data;
self .left = None ;
self .right = None ;
def isPathUtil(curList, curTree):
if (curList = = None ): return True ;
if (curTree = = None ): return False ;
if (curList.val = = curTree.val):
return (
isPathUtil(curList. next , curTree.left) or
isPathUtil(curList. next , curTree.right)
);
else :
return False ;
def isPath(head, root):
if (root = = None ): return False ;
if (head = = None ): return True ;
isPossible = False ;
if (root.val = = head.val):
isPossible = isPathUtil(head. next , root.left) or isPathUtil(head. next , root.right);
return isPossible or isPath(head, root.left) or isPath(head, root.right);
root = treeNode( 1 );
root.left = treeNode( 2 );
root.right = treeNode( 3 );
root.left.left = treeNode( 4 );
root.left.right = treeNode( 5 );
root.left.right.left = treeNode( 7 );
root.right.right = treeNode( 6 );
root.right.right.left = treeNode( 8 );
root.right.right.right = treeNode( 9 );
head = listNode( 3 );
head. next = listNode( 6 );
head. next . next = listNode( 8 );
print ( "Yes" if isPath(head, root) else "No" );
|
C#
using System;
public class GFG{
class listNode {
public int val;
public listNode next;
public listNode( int data)
{
this .val = data;
next = null ;
}
};
class treeNode {
public int val;
public treeNode right;
public treeNode left;
public treeNode( int data)
{
this .val = data;
this .left = null ;
this .right = null ;
}
};
static bool isPathUtil(listNode curList,
treeNode curTree)
{
if (curList == null )
return true ;
if (curTree == null )
return false ;
if (curList.val == curTree.val) {
return isPathUtil(curList.next,
curTree.left)
|| isPathUtil(curList.next,
curTree.right);
}
else {
return false ;
}
}
static bool isPath(listNode head, treeNode root)
{
if (root == null )
return false ;
if (head == null )
return true ;
bool isPossible = false ;
if (root.val == head.val) {
isPossible = isPathUtil(
head.next, root.left)
|| isPathUtil(
head.next, root.right);
}
return isPossible || isPath(head, root.left)
|| isPath(head, root.right);
}
public static void Main(String[] args)
{
treeNode root = new treeNode(1);
root.left = new treeNode(2);
root.right = new treeNode(3);
root.left.left = new treeNode(4);
root.left.right = new treeNode(5);
root.left.right.left = new treeNode(7);
root.right.right = new treeNode(6);
root.right.right.left = new treeNode(8);
root.right.right.right = new treeNode(9);
listNode head = new listNode(3);
head.next = new listNode(6);
head.next.next = new listNode(8);
Console.Write((isPath(head, root) ? "Yes" : "No" ));
}
}
|
Javascript
<script>
class listNode
{
constructor(data) {
this .val = data;
this .next = null ;
}
}
class treeNode
{
constructor(data) {
this .val = data;
this .left = null ;
this .right = null ;
}
}
function isPathUtil(curList, curTree)
{
if (curList == null ) return true ;
if (curTree == null ) return false ;
if (curList.val == curTree.val)
{
return (
isPathUtil(curList.next, curTree.left) ||
isPathUtil(curList.next, curTree.right)
);
}
else
{
return false ;
}
}
function isPath(head, root)
{
if (root == null ) return false ;
if (head == null ) return true ;
let isPossible = false ;
if (root.val == head.val) {
isPossible =
isPathUtil(head.next, root.left) || isPathUtil(head.next, root.right);
}
return isPossible || isPath(head, root.left) || isPath(head, root.right);
}
let root = new treeNode(1);
root.left = new treeNode(2);
root.right = new treeNode(3);
root.left.left = new treeNode(4);
root.left.right = new treeNode(5);
root.left.right.left = new treeNode(7);
root.right.right = new treeNode(6);
root.right.right.left = new treeNode(8);
root.right.right.right = new treeNode(9);
let head = new listNode(3);
head.next = new listNode(6);
head.next.next = new listNode(8);
document.write(isPath(head, root) ? "Yes" : "No" );
</script>
|
Time Complexity: O(N * M) where N = Number of nodes in the Binary Tree and M = Number of nodes in the Linked list. Auxiliary Space: O(height of the tree)
|