递归
- 思路:
- 递归子问题:
- 确认节点 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)
- 即:
- 整体代码:
/*** 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;
};