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;
    }
}
相关推荐
Genevieve_xiao10 分钟前
【数据结构与算法】【xjtuse】面向考纲学习(下)
java·数据结构·学习·算法
修炼地12 分钟前
代码随想录算法训练营第二十七天 | 56. 合并区间、738.单调递增的数字、968.监控二叉树
c++·算法
仰泳的熊猫14 分钟前
1031 Hello World for U
数据结构·c++·算法·pat考试
高山上有一只小老虎20 分钟前
小红的正整数计数
java·算法
AnAnCode21 分钟前
【时间轮算法-实战】Java基于Netty的 `HashedWheelTimer`快速搭建时间轮算法系统
java·开发语言·算法·时间轮算法
liu****31 分钟前
12.C语言内存相关函数
c语言·开发语言·数据结构·c++·算法
FPGA_无线通信1 小时前
OFDM 精频偏补偿
算法·fpga开发
FMRbpm1 小时前
栈练习--------从链表中移除节点(LeetCode 2487)
数据结构·c++·leetcode·链表·新手入门
程序员-King.1 小时前
day109—同向双指针(字符串)—每个字符最多出现两次的最长子字符串(LeetCode-3090)
算法·leetcode·双指针
青山的青衫1 小时前
【单调栈和单调队列】LeetCode hot100+面试高频
算法·leetcode·面试