Category | Difficulty | Likes | Dislikes |
---|
algorithms | Medium (68.41%) | 1530 | - |
Tags
tree
Companies
amazon
| apple
| facebook
| linkedin
| microsoft
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
1
2
3
| 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
|
示例 2:
1
2
3
| 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
|
示例 3:
1
2
| 输入:root = [1,2], p = 1, q = 2
输出:1
|
提示:
- 树中节点数目在范围
[2, 105]
内。 -109 <= Node.val <= 109
- 所有
Node.val
互不相同
。 p != q
p
和 q
均存在于给定的二叉树中。
Discussion | Solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class Solution {
public:
/*
## 解题思路
* 最近公共祖先为:
1. 若root为null,或为p,q之一,则最近公共祖先为root;
2. 否则,分别递归在左右子树中查找最近公共祖先;
3. 如果左右子树中都不存在最近公共祖先,则为root;
*/
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root || root == p || root == q) return root;
auto left = lowestCommonAncestor(root->left, p, q);
auto right = lowestCommonAncestor(root->right, p, q);
return !left ? right : !right? left: root;
}
};
|