Code360 powered by Coding Ninjas X Naukri.com. Code360 powered by Coding
Ninjas X Naukri.com

Last Updated: 6 Dec, 2020

Moderate

```
You may assume that given ‘X’ and ‘Y’ definitely exist in the given binary tree.
```

```
For the given binary tree
```

```
LCA of ‘X’ and ‘Y’ is highlighted in yellow colour.
```

```
The first line contains elements of the tree in the level order form. The line consists of values of nodes separated by a single space. In case a node is null, we take -1 in its place.
The second line contains two integers ‘X’ and ‘Y’ denoting the two nodes of the binary tree.
For example, the input for the tree depicted in the below image would be :
```

```
1
2 3
4 -1 5 6
-1 7 -1 -1 -1 -1
-1 -1
```

```
Level 1 :
The root node of the tree is 1
Level 2 :
Left child of 1 = 2
Right child of 1 = 3
Level 3 :
Left child of 2 = 4
Right child of 2 = null (-1)
Left child of 3 = 5
Right child of 3 = 6
Level 4 :
Left child of 4 = null (-1)
Right child of 4 = 7
Left child of 5 = null (-1)
Right child of 5 = null (-1)
Left child of 6 = null (-1)
Right child of 6 = null (-1)
Level 5 :
Left child of 7 = null (-1)
Right child of 7 = null (-1)
The first not-null node(of the previous level) is treated as the parent of the first two nodes of the current level. The second not-null node (of the previous level) is treated as the parent node for the next two nodes of the current level and so on.
The input ends when all nodes at the last level are null(-1).
```

```
The above format was just to provide clarity on how the input is formed for a given tree.
The sequence will be put together in a single line separated by a single space. Hence, for the above-depicted tree, the input will be given as:
1 2 3 4 -1 5 6 -1 7 -1 -1 -1 -1 -1 -1
```

```
Print an integer denoting the LCA of the given binary tree nodes.
```

```
You do not need to print anything, it has already been taken care of. Just implement the given function.
```

The basic idea of this approach is to list down all the ancestors of the given nodes. And then, we will choose the common ancestor from the two lists which is farthest from the root of the tree.

Consider the binary tree as shown in the above figure, where we are trying to find the LCA of **X** and **Y**. Let us try to find the path from the root node to **X** and **Y** respectively and store the nodes present in the path in two separate lists **pathToX** and **pathToY**. Observe that the first few nodes(here nodes in yellow colour) in the lists will be the same which are common ancestors of node **X** and **Y**. Now, we need a common ancestor which is farthest from the root node. It is quite clear from the above image that the last common node in the lists will be the LCA.

Consider the following steps to describe the approach explained above:

- Initialise two empty lists
**pathToX**and**pathToY**to store the nodes in the path from the root node to ‘X’ and ‘Y’ respectively.- Perform a pre-order traversal to find the nodes in the path from the root node to
**X**and store it in the**pathToX**such that the first element in the list is the root node. - Similarly, perform a pre-order traversal to find the nodes in the path from the root node to ‘Y’ and store it in the
**pathToY**such that the first element in the list is the root node.

- Perform a pre-order traversal to find the nodes in the path from the root node to
- Now, start iterating from the front of the lists while the elements are equal.
- The last equal element will be the LCA of
**X**and Y.

The basic idea of this approach is to find the LCA in a single traversal without using any extra space.

Let us start moving from the root node. Now consider the following situations:

- If either
**X**or**Y**is the root node, then the LCA of**X**and**Y**will be the root node itself because the root node is the topmost node in the binary tree. - If
**X**and**Y**exist in the left subtree, then the LCA will be necessarily present in the left subtree because the farthest common ancestor from the root node will be present in the left subtree. - Similarly, if
**X**and**Y**exist in the right subtree, then the LCA will be necessarily present in the right subtree. - If both
**X**and**Y**are present in the different subtrees, then the LCA will be the root node.

We can easily generalize the points mentioned above for any node. Let

`findLCA(TreeNode* root, int X, int Y) `

be a function that returns the **LCA** of **X** and **Y** in the given tree or return -1 if it does not exist. Now consider the steps as follows:

- If the root is
**NULL**, then return -1 because**LCA**will not exist in an empty tree. - If either the root is equal to
**X**or**Y**return root. In this case, the root node itself will be**LCA**because the root is the topmost node in the binary tree. - Let us find the
**LCA**in the left subtree and store it in a variable**leftLCA**, i.e.**leftLCA = findLCA(left-child of the root, X, Y)** - Similarly, find the
**LCA**in the right subtree and store it in a variable**rightLCA**i.e.**rightLCA = findLCA(right-child of the root, X, Y)** - If
**leftLCA**and**rightLCA**both are not equal to -1, then the root must be the LCA. Because both ‘X’ and ‘Y’ are present in two different subtrees. - Otherwise, the LCA must be present in either of the two subtrees.
- If
**leftLCA**is not equal to -1, return**leftLCA.** - Otherwise, return
**rightLCA**.

- If

Similar problems

Ninja and Tree

Ninja

Posted: 5 Feb, 2022

Kth Largest Element in BST

Moderate

Posted: 12 Mar, 2022

Height of Binary Tree

Easy

Posted: 22 Apr, 2022

Height of Binary Tree

Easy

Posted: 22 Apr, 2022

Height of Binary Tree

Easy

Posted: 22 Apr, 2022

Min Heap

Moderate

Posted: 5 May, 2022

Min Heap

Moderate

Posted: 5 May, 2022

Locked Binary Tree

Easy

Posted: 12 May, 2022