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

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

示例 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 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

提示:

树中节点数目在范围 [2, 105] 内。
-109 <= Node.val <= 109
所有 Node.val 互不相同 。
p != q
p 和 q 均存在于给定的二叉树中。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

感谢大佬数据结构和算法的详细解法java代码递归和非递归图文详解

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//      return lowestCommonAncestorI(root, p, q);return lowestCommonAncestorII(root, p, q);}//方法二:迭代,记录每个节点的父节点//时间和空间复杂度O(N)private TreeNode lowestCommonAncestorII(TreeNode root, TreeNode p, TreeNode q) {Map<TreeNode, TreeNode> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);//根节点不存在父节点parent.put(root, null);//没有必要遍历全部节点,只要找到两个节点就可以while (!parent.containsKey(p) || !parent.containsKey(q)) {TreeNode node = queue.poll();if (node.left != null) {queue.offer(node.left);parent.put(node.left, node);}if (node.right != null) {queue.offer(node.right);parent.put(node.right, node);}}//记录p和p的祖先节点Set<TreeNode> ancestors = new HashSet<>();while (p != null) {ancestors.add(p);p = parent.get(p);}//查看p和它的祖先节点是否包含q节点,如果不包含再看是否包含q的祖先节点while (!ancestors.contains(q)) {q = parent.get(q);}return q;}//方法一:递归,时间和空间复杂度O(N)private TreeNode lowestCommonAncestorI(TreeNode root, TreeNode p, TreeNode q) {if (root == null) {return null;}return findLCA(root, p.val, q.val);}private TreeNode findLCA(TreeNode root, int val1, int val2) {if (root == null) {return null;}//如果找到一个值为val1或val2的节点,说明该节点就是LCA节点if (root.val == val1 || root.val == val2) {return root;}TreeNode left = findLCA(root.left, val1, val2);TreeNode right = findLCA(root.right, val1, val2);//如果一个节点能够在它的左右子树中分别找到p和q,则该节点为LCA节点if (left != null && right != null) {return root;}return left != null ? left : right;}
}

Leetcode刷题236. 二叉树的最近公共祖先相关推荐

  1. 【LeetCode笔记】236. 二叉树的最近公共祖先(Java、二叉树、DFS)

    文章目录 题目描述 思路 & 代码 题目描述 ac了,但是看了题解发现有更好的做法 思路 & 代码 对于一个结点rootNode,p.q有这么几种情况: p.q分别在其左右子树中,那么 ...

  2. LeetCode二叉树系列——236.二叉树的最近公共祖先

    一.题目描述: 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表 ...

  3. 【LeetCode】【HOT】236. 二叉树的最近公共祖先(递归)

    [LeetCode][HOT]236. 二叉树的最近公共祖先 文章目录 [LeetCode][HOT]236. 二叉树的最近公共祖先 package hot;class TreeNode{int va ...

  4. 力扣(LeetCode)236. 二叉树的最近公共祖先(C语言)

    一.环境说明 本文是 LeetCode 236. 二叉树的最近公共祖先,使用c语言实现. 递归. 测试环境:Visual Studio 2019. 二.代码展示 精简代码: struct TreeNo ...

  5. 【经典算法题】二叉树的最近公共祖先

    [经典算法题]二叉树的最近公共祖先 Leetcode 0235 二叉搜索树的最近公共祖先 题目描述:Leetcode 0235 二叉搜索树的最近公共祖先 分析 本题的考点:LCA(最近公共祖先). 关 ...

  6. Suzy找到实习了吗 Day 21 | 二叉树进行中:530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先

    530. 二叉搜索树的最小绝对差 题目 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 .差值是一个正数,其数值等于两值之差的绝对值. solution # Defi ...

  7. leetcode 236. 二叉树的最近公共祖先 递归解法 c语言

    如题: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x, 满足 x 是 p.q ...

  8. 最近公共祖先_leetcode No.236 二叉树的最近公共祖先

    承接二叉搜索树的最近公共祖先. 题目链接: 二叉树的最近公共祖先 - 力扣(LeetCode)​leetcode-cn.com 题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百 ...

  9. LeetCode刷题笔记 二叉树 二叉搜索树的操作

    669 修剪二叉搜索树 ​ 给定一个二叉查找树和两个整数 L 和 R,且 L < R,试修剪此二叉查找树,使得修剪后所有节点的值都在 [L, R] 的范围内. ​ 输入是一个二叉查找树和两个整数 ...

最新文章

  1. 客户管理系统企业客户管理crm客户管理
  2. 四层交换机是什么?有什么用?与二层/三层交换机有何区别?
  3. django 单元测试小结
  4. 数据科学竞赛-人脸表情识别
  5. 【C/C++ 汇编语言 Verilog】越界截断——数据越界问题的多角度分析
  6. 《趋势的力量》-- 观念决定了个人发展的战略路线(大学生选择专业、就业、考研与否的建议)
  7. exists sql用法_彻底弄懂sql select各种查询用法
  8. 乐高小颗粒履带机器人_乐高搭建+乐高编程…快带小朋友来漳州这家培训中心,边玩边学...
  9. (非本校)湖南工业大学个人选拔赛第一场 解题报告
  10. iOS不再美好 安卓收入逼近千万
  11. 李健清华计算机专业,计算机DeepWeb数据库的分类研究李健
  12. 阿里云上创建 对象存储oss
  13. 本地网络出现了一个意外的情况,不能完成所有你在设置中所要求的更改?
  14. C++多态的职工管理系统
  15. ABAP BAPI 复制标准项目模板实现项目立项
  16. 中南大学计算机学院研究生录取分数线,中南大学研究生录取分数线
  17. macOS Mojave 10.14.6 18G103 正式版 with Clover 5091原版镜像[双EFI双平台终极版]
  18. 谷歌文件系统论文中文版
  19. 浏览ASP时遇到以下错误: Microsoft VBScript 运行时错误 错误 '800A01AD' ActiveX 部件不能创建对象:'NetBox.HttpServer'
  20. 程序员是否可以在家办公——在家办公的利与弊

热门文章

  1. ClearCase洋文翻译-rebase(变基)
  2. BPM180_STM32F103系列驱动代码,加入了移动平均值滤波算法
  3. RFID室内定位之landmarc算法
  4. EAV模型 Entity-Attribute-Value
  5. C# Queue与RabbitMQ的爱恨情仇(文末附源码):Q与MQ消息队列简单应用(一)
  6. myFAX网络传真服务器与同类产品比较的优势
  7. 劲舞团服务器维护结束后的服装,劲舞团手游12月1日更新内容 新增新时装、冬季恋歌活动更新[图]...
  8. 语音识别工具箱之kaldi介绍
  9. scss里用calc计算百分比
  10. 统一将gif格式的图片转换为gpj