二叉树的最近公共祖先(C++实现)

算法思路

我们遍历整颗二叉树,定义F(x)表示x节点的子树或本身是否包含p节点或q节点,如果包含即为true。那么符合条件的最近公共祖先x一定满足如下条件:

F(x->lchild)&&F(x->rchild) || ((x=p||x=q)&&F(x->lchild)||F(x->rchild))

意为:左子树包含q且右子树包含p 或者 x为p(或q)且q(或p)是他的子树

 

C++代码

class Solution {
public:
    TreeNode* ans=NULL;
    bool dfs(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == NULL)return false;
        bool inc = root->val == p->val || root->val == q->val;
        bool l = dfs(root->left, p, q);
        bool r = dfs(root->right, p, q);
        if (l && r || (inc && (l || r))) {
            ans = root;
        }
        return l || r || inc;
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        dfs(root, p, q);
        return ans;
    }
};

 

posted @ 2020-09-27 23:19  tao10203  阅读(455)  评论(0)    收藏  举报