236. 二叉树的最近公共祖先 - 力扣(LeetCode)

题目描述

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

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

题目示例

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

输出:3

解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

解题思路

考虑通过递归对二叉树进行先序遍历,当遇到节点 p 或 q 时返回。从底至顶回溯,当节点 p,q 在节点 root 的异侧时,节点 root 即为最近公共祖先,则向上返回 root 。

终止条件:

  • 当越过叶节点,直接返回 null;
  • 当 root 等于 p 或者 q,直接返回 root;

递归工作:

  • 开启递归左子节点,记录为 left,左子树的最大祖先;
  • 开启递归右子节点,记录为 right,右子树的最大祖先;

返回值:根据 left 和 right,可分为四种情况

  • 当 left 和 right 同时为空,说明左右子树都不包含 p/q,直接返回 null;
  • 当 left 和 right 同时不为空,说明 p 和 q 分别在左子树和右子树中,因此 root 为最近公共祖先,返回 root;
  • 当 left 为空,但 right 不为空,说明 p/q 不在左子树上,直接返回 right;
  • 当 right 为空,但 left 不为空,说明 p/q 不在右子树上,直接返回 left。

参考代码

java 复制代码
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);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if(left == null) {
            return right;
        }
        if(right == null) {
            return left;
        }
        return root;
    }
}
相关推荐
测试老哥15 分钟前
功能测试干了三年,快要废了。。。
自动化测试·软件测试·python·功能测试·面试·职场和发展·压力测试
眰恦37423 分钟前
数据结构--第六章图
数据结构·算法
2401_8628867832 分钟前
蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
前端·c++·python·算法·游戏
luthane34 分钟前
python 实现armstrong numbers阿姆斯壮数算法
python·算法
楠枬37 分钟前
双指针算法
java·算法·leetcode
sjsjs1139 分钟前
【数据结构-差分】力扣1589. 所有排列中的最大和
数据结构·算法·leetcode
小川_wenxun1 小时前
优先级队列(堆)
java·开发语言·算法
孙小二写代码1 小时前
[leetcode刷题]面试经典150题之4删除有序数组中的重复项II(中等)
算法·leetcode·面试
tlsnzcel2 小时前
【java】常见限流算法原理及应用
java·算法