leetcode——236. 二叉树的最近公共祖先

思路

  1. 递归条件——结点为空 返回false
  2. 递归左右子树
  3. 判断 p q 是否分布在两旁
  4. 如果不是 则集中在左边 或 右边 或 一个结点即当前根

代码

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);
        //q p分布在两边 或者 q/p分布在任意边子树 而另一分布在根节点
        if ((lson && rson) || ((root->val == p->val||root->val == q->val) && (lson || rson))) 
            ans = root;
        //继续寻找——pq集中在左子树 或 右子树 或一个结点即为当前结点
        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;
    }
};

你可能感兴趣的:(Leetcode)