BM38. [在二叉树中找到两个节点的最近公共祖先]

alt

https://www.nowcoder.com/exam/oj?tab=%E7%AE%97%E6%B3%95%E7%AF%87&topicId=295

BM38. 在二叉树中找到两个节点的最近公共祖先

https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116?tpId=295&sfm=github&channel=nowcoder

根据题目直接上模板就可以了

public int lowestCommonAncestor (TreeNode root, int p, int q) {

    int left = lowestCommonAncestor(root.left, p, q);
    int right = lowestCommonAncestor(root.right, p, q);
}

然后看题目公共祖先的定义也就是从当前节点出发,在当前节点可以左子树可以找到一个点,在有子树可以找到一个点。节点本身可以视为自己的祖先。

img

比如5和1的最近公共祖先就是3

5和6的最近公共祖先就是5

7和0的最近公共祖先就是3

思考一下是不是我们从上到下遍历二叉树,如果当前节点等于两个子节点其中的一个那么这个节点就是最近公共祖先,因为另一个节点不是存在他的左子树就是存在他的右子树。所以我们继续左右子树找和目标节点1和目标节点2相等的点。那么接下来就有出现三种情况

  1. 目标1在左子树,目标2在有子树
  2. 目标1和2都在左子树
  3. 目标1和3都在有子树
  4. 因为肯定存在这样的两个点所以不会出现都不在的情况

其实我们可以将上面情况抽象为两大类
第一类是和当前节点有关系,所以判断和当前节点是否相等
第二类当前节点没有关系受到左右子树的结果影响

由于我们我们返回的是找到的其中的一个节点的值的位置,数据范围0<=节点值<=10000,所以我们可以将没有找到这个节点值返回-1

public int lowestCommonAncestor (TreeNode root, int p, int q) {
    if(root == null)
      return -1;
    //找到了任意一个值就可以返回证明有值在这个子树
    if (p == root.val || q == root.val) {
      return root.val;
    }
    // 如果公共祖先在左侧,那么就输出左面的点即可
    int left = lowestCommonAncestor(root.left, p, q);
    int right = lowestCommonAncestor(root.right, p, q);
    if(left > 0 && right == -1)
      return left;
    if(right > 0 && left == -1)
      return right;
    if(left > -1 && right > -1)
        return root.val;
    return -1;
  }

复杂度分析:

  • 时间复杂度:,其中为节点数,递归遍历二叉树每一个节点
  • 空间复杂度:,最坏情况二叉树化为链表,深度为,递归栈深度为

alt

#面经##题解##面试题目#
全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务