二叉树的最近公共祖先(LeetCode)

本文解析了如何使用深度优先搜索(DFS)策略在给定的二叉树中寻找两个指定节点的最近公共祖先,通过递归遍历和判断节点关系来确定最近公共祖先节点。

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

原题来自此链接

题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

在这里插入图片描述
示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

说明:

所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。

思路

采用dfs对树进行搜索,如果找到p就返回p,找到q就返回q,如果结点为空就返回空。

回溯时在上一层接收左右子树返回值,如果左右子树都非空(那必然左右分别为p、q或者q、p),最近公共祖先就是当前结点root;如果只有左树非空,那可能左树中找到了最近公共祖先或者左树中包含p、q其中一个;如果只有右树非空,那可能右树中找到了最近公共祖先或者右树中包含p、q其中一个;如果都为空,那就返回NULL。

至于为什么左右子树找到p、q就可以判断当前节点是最近公共祖先,这是因为回溯时是自底向上的,所以第一次出现左右子树包含p、q就意味着当前节点是最近公共祖先。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL||root==p||root==q)
            return root;
        TreeNode *left=lowestCommonAncestor(root->left,p,q),*right=lowestCommonAncestor(root->right,p,q);
        //在左右子树找到了p、q,当前节点就是最近公共祖先
        if(left&&right)
            return root;
        //只有左子树非空
        if(left)
            return left;
        //只有右子树非空
        if(right)
            return right;
        return NULL;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值