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

这篇博客探讨了如何使用深度优先搜索(DFS)在二叉树中找到两个指定节点的最低公共祖先(LCA)。递归条件是当节点为空时返回false。通过遍历左右子树,判断给定的p和q节点是否分别位于左右两侧或集中于同一侧。如果找到符合条件的节点,更新答案。最后返回lson(左子树)或rson(右子树)或根节点(p或q的值等于根节点的值)的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路

  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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值