力扣236. 二叉树的最近公共祖先

递归

  • 思路:
    • 递归子问题:
      • 确认节点 p、q 是否在节点 root 子树中:
        • lson = isChild(root->left, p, q);
        • rson = isChild(root->right, p, q);
        • 在 root 子树中的条件是: 在左子树中、或者在右子树中、或者 p/q 就是当前节点:lson || rson || (root->val == p->val || root->val == q->val)
    • 而符合最近公共祖先节点的条件是:
      • p/q 在当前节点 root 左子树且在右子树中:(lson && rson)
      • 或者 p/q 为当前节点 root,同时,p/q 之一在 root 左子树或者右子树中:(root->val == p->val || root->val == q->val) && (lson || rson)
      • 即:
        • if ((lson && rson) || 
             ((root->val == p->val || 
                  root->val == q->val) && 
                  (lson || rson))) {
              ans = root;
          } 

    • 整体代码:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        isChild(root, p, q);
        return ans;
    }

private:
    bool isChild(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == nullptr) return false;
        bool lson = isChild(root->left, p, q);
        bool rson = isChild(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);
    }

private:
    TreeNode* ans;
};

你可能感兴趣的:(力扣实践,leetcode,算法,职场和发展)