题解DFS递归 LeetCode 236. 二叉树的最近公共祖先

思路

深度优先搜索递归

解题过程

1. find函数:
• 递归函数,用于查找树中是否包含节点p或q,并更新最近公共祖先ans。
• 如果当前节点为空或已经找到最近公共祖先,返回false。
• 递归查找左子树和右子树。
• 检查当前节点是否是p或q。
• 如果当前节点是p或q,或者左子树和右子树中包含p或q中的两个,则当前节点是最近公共祖先。
• 返回当前节点、左子树或右子树中是否包含p或q。
2. lowestCommonAncestor函数:
• 主函数,用于查找二叉树中节点p和q的最近公共祖先。
• 初始化最近公共祖先为nullptr。
• 调用递归函数查找最近公共祖先。
• 返回最近公共祖先。

复杂度

  • 时间复杂度: O(N)
  • 空间复杂度: O(H)

    Code

    class Solution {
    public:
        // 递归函数,查找树中是否包含节点 p 或 q,并更新最近公共祖先 ans
        bool find(TreeNode* root, TreeNode* p, TreeNode* q, TreeNode*& ans) {
            if (!root || ans) return false; // 如果当前节点为空或已经找到最近公共祖先,返回 false
            
            // 递归查找左子树和右子树
            bool left = find(root->left, p, q, ans);
            bool right = find(root->right, p, q, ans);
            
            // 检查当前节点是否是 p 或 q
            bool mid = (root == p || root == q);
            
            // 如果当前节点是 p 或 q,或者左子树和右子树中包含 p 或 q 中的两个,则当前节点是最近公共祖先
            if (mid + left + right >= 2) {
                ans = root;
            }
            
            // 返回当前节点、左子树或右子树中是否包含 p 或 q
            return mid || left || right;
        }
    
        // 主函数,查找二叉树中节点 p 和 q 的最近公共祖先
        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
            TreeNode* ans = nullptr; // 初始化最近公共祖先为 nullptr
            find(root, p, q, ans); // 调用递归函数查找最近公共祖先
            return ans; // 返回最近公共祖先
        }
    };

    我在LeetCode上也发了该题的题解,还有其他题目的题解,需要的话可以进以下链接。
    链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/solutions/3599784/dfsshen-du-you-xian-sou-suo-di-gui-by-no-jq9m/

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值