具体题目见Leetcode第236题
思路:还是那句话,树的大多数问题都可以通过递归解决
方法一:本题中因为祖先可能是自己,所以通过设置三个bool变量lf,ri,mid分别表示左子树是否有结点,右子树是否有结点,自身是否为结点。通过表达式(lf && ri)||(lf && mid)||(mid && ri)判断是否为公共祖先。
我的代码:
class Solution {
public:
TreeNode* near_acc;
bool dfs(TreeNode* root,int p,int q){
if(root == nullptr)
return 0;
bool lf=0,ri=0,mid=0;
if(root->val == p || root->val == q)
mid = 1;
lf = dfs(root->left,p,q);
ri = dfs(root->right,p,q);
if((lf && ri)||(lf && mid)||(mid && ri))
{
near_acc = root;
return 1;
}
else if(lf || ri || mid)
return 1;
else
return 0;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
dfs(root,p->val,q->val);
return near_acc;
}
};
标准答案:通过设置返回值表达式,简化了代码
class Solution {
public:
TreeNode* ans;
bool dfs(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == nullptr) return false;
bool lson = dfs(root->left, p, q);
bool rson = dfs(root->right, p, q);
if ((lson && rson) || ((root->val == p->val || root->val == q->val) && (lson || rson))) {
ans = root;
}
return lson || rson || (root->val == p->val || root->val == q->val);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
dfs(root, p, q);
return ans;
}
};
方法二:哈希表记录父结点
除递归还有一种方法,有时间再写