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 Node
is below:
class Node { public int val; public Node left; public Node right; public Node parent; }
According to the definition of LCA on Wikipedia: "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)."
Example 1:
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.
Example 2:
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.
Example 3:
Input: root = [1,2], p = 1, q = 2 Output: 1
Constraints:
- 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
andq
exist in the tree.
Companies:
Facebook, LinkedIn, Microsoft, Apple, Amazon, Yandex
Related Topics:
Tree
Similar Questions:
- Lowest Common Ancestor of a Binary Search Tree (Easy)
- Lowest Common Ancestor of a Binary Tree (Medium)
- Lowest Common Ancestor of a Binary Tree II (Medium)
- Lowest Common Ancestor of a Binary Tree IV (Medium)
// OJ: https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-iii/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
int getLength(Node *p) {
int ans = 0;
for (; p->parent; p = p->parent, ++ans);
return ans;
}
public:
Node* lowestCommonAncestor(Node* p, Node * q) {
int a = getLength(p), b = getLength(q);
if (a < b) swap(a, b), swap(p, q);
a -= b;
while (a-- > 0) p = p->parent;
while (p != q) p = p->parent, q = q->parent;
return p;
}
};