Lowest Common Ancestor of a Binary Tree III
The problem
Given two nodes of a binary tree p and q, return their lowest common ancestor (LCA).
Each node will have a reference to its parent node. The definition for is below
class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode parent; }
The lowest common ancestor of two nodes p and q in a tree T is the lowest node that has both p and q as descendants (where we allow a node to be a descendant of itself).
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 Output: 3 Explanation: The LCA of nodes 5 and 1 is 3.
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 Output: 5 Explanation: The LCA of nodes 5 and 4 is 5 since a node can be a descendant of itself according to the LCA definition.
Input: root = [1,2], p = 1, q = 2
- The number of nodes in the tree is in the range [2, 105].
- -109 <= Node.val <= 109
- All Node.val are unique.
- p != q
- p and q exist in the tree.
cpp
/*
// Definition for a Node.
class TreeNode {
public:
int data;
TreeNode* left;
TreeNode* right;
TreeNode* parent;
};
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* p, TreeNode* q) {
}
};java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int data;
* TreeNode left;
* TreeNode right;
* TreeNode parent;
* TreeNode(int x) { data = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode p, TreeNode q) {
// Your Code Goes Here
}
}python
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.data = x
# self.left = None
# self.right = None
# self.parent = None
class Solution:
def lowestCommonAncestor(self, p, q):javascript
/**
* Definition for a binary tree node.
* class TreeNode {
* constructor(data = 0, left = null, right = null){
* this.data = data;
* this.left = null;
* this.right = null;
* this.parent = null;
* }
* }
**/
class Solution {
lowestCommonAncestor(p,q) {
//your code goes here
}
}csharp
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int data;
* public TreeNode left;
* public TreeNode right;
* public TreeNode parent;
* TreeNode(int x) { data = x; }
* }
*/
public class Solution {
public TreeNode lowestCommonAncestor(TreeNode p, TreeNode q) {
// Your Code Goes Here
}
}go
func lowestCommonAncestor(p, q *TreeNode) *TreeNode {
// Your code goes here
}Stuck? Show a way to structure it+
- 01Start one pointer at each node.
- 02Move each pointer to its parent on every step.
- 03When a pointer reaches null, redirect it to the other start node.
- 04Stop when pointers meet.
- 05Return the meeting node or null.
Reference answer
Then expect these follow-ups
What hash-set alternative would you use?
Tests: tradeoffs
How would you solve it without parent pointers?
Tests: tree traversal
Hiring now
Linkedin has 196 open roles right now
landed applies to roles like these for you, on each company’s own site, with answers written for the role.
Software Engineer - Systems and Infrastructure
Mountain View, CA, United States
Staff Software Engineer
Mountain View, CA, United States
Staff Software Engineer, Systems Infrastructure
Bengaluru, KA, India
Next question