二叉树的最近公共祖先
题目描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。“
解题思路
差点给我绕进去了,我的方法是递归遍历二叉树,返回值是找到了多少个目标节点,当第一次出现2时,把值归零。这样就可以找到最近的公共祖先了。
其中当节点等于目标节点中任意一个时,把值加一,然后把左右子树递归的返回值加上,这个值就是用来记录的,而且可以拓展至n个节点的最近公共祖先。
但是这个解法也是有局限性的,一方面找到公共祖先后仍然需要继续递归直至结束。
题解
class Solution {
public:
int func(TreeNode* root, TreeNode* p, TreeNode* q, TreeNode*& ans) {
if(!root) {
return false;
}
int n = 0;
if(root == p || root == q){
n++;
}
n += func(root->left, p, q, ans);
n += func(root->right, p, q, ans);
if(n == 2){
ans = root;
n = 0;
}
return n;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* ans = root;
func(root, p, q, ans);
return ans;
}
};
2490

被折叠的 条评论
为什么被折叠?



