Time: 20190907
Type: Medium

题目描述

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

百度百科中最近公共祖先的定义为:“对于有根树 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 为不同节点且均存在于给定的二叉树中。

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

思路

这是普通的二叉树,因此不能利用二叉搜索树特有的有序的特性,根据大小即可判断最近公共祖先的位置。

首先在二叉树中搜索给定的节点 p 和 q,然后找到它们的最近共同祖先。我们可以使用普通的树遍历来搜索这两个节点。一旦我们达到所需的节点 p 和 q,我们就可以回溯并找到最近的共同祖先。

作者:LeetCode
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/er-cha-shu-de-zui-jin-gong-gong-zu-xian-by-leetcod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这是比较直观的想法,关键在于如何用代码实现这个逻辑。

代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def __init__(self):self.res = Nonedef lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':def dfs(root):if not root:return Falseleft = dfs(root.left)right = dfs(root.right)mid = (root == p or root == q)if mid + left + right >= 2:self.res = rootreturn mid or left or rightdfs(root)return self.res

END.

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

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

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

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

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

  3. LeetCode 236. 二叉树的最近公共祖先

    文章目录 解法1:保存祖先节点+逐个判断 解法2:深度优先遍历 解法3:记录祖先节点 https://leetcode-cn.com/problems/lowest-common-ancestor-o ...

  4. 最近公共祖先_[LeetCode] 236. 二叉树的最近公共祖先

    题目链接: https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree 难度:中等 通过率:57.2% 题目描述: ...

  5. leetcode 236. 二叉树的最近公共祖先LCA(后序遍历,回溯)

    LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先.百度百科 ...

  6. [leetcode]236.二叉树的最近公共祖先

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

  7. leetcode 236. 二叉树的最近公共祖先 思考分析

    目录 题目 思考分析 改进 本文章代码思路来源于公众号[代码随想录] 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个 ...

  8. LeetCode 236. 二叉树的最近公共祖先(递归)

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

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

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

最新文章

  1. 泛型委托在项目中的应用
  2. zabbix snmp trap 监控
  3. python 实现卷积操作
  4. HDOJ 1202 The calculation of GPA
  5. 基于容器的全链路运维平台实践
  6. 菜鸟教程之工具使用(六)——让Maven项目直接在eclipse内部的Tomcat中执行
  7. RGB/YUV/YCbCr--关于显示,颜色你需要了解的一些事
  8. Java面向对象(5)--类的成员构造器(构造方法)
  9. Console.Write(程序猿?开发?写代码?编程?移动、网页、桌面开发?Oh,我连菜鸟都不是!);...
  10. 工作 10 年,月薪过万者不足三成,程序员却笑了!
  11. C语言知识点笔记完全整理
  12. 如何用用计算机名访问共享打印机,局域网怎么连接共享打印机共享
  13. SQL语法 Access
  14. vue+cesium实现风场
  15. 如何写好 5000 行的 SQL 代码
  16. ORACLE中dual的详解及其故障恢复
  17. Nginx设置访问Web页面时用户名密码验证
  18. 2022年起重机械指挥特种作业证考试题库模拟考试平台操作
  19. C#用Replace把字符替换成空
  20. 串口---串口通信数据位长度对传输数据的影响

热门文章

  1. Ubuntu学习日记--Lesson8:make 21 | tee log.txt命令解析 (错误输出,重定向,管道符)
  2. LeetCode-21.合并两个有序链表(链表+递归)
  3. OpenCV图像处理(12)——保存图像到指定位置
  4. android+p预览版小米,吃上安卓P!小米8更新首个Android P内测版
  5. 扫描仪twain驱动是什么_扫描仪无法显示怎么办 扫描仪无法显示解决方法【详解】...
  6. @param注解什么意思_Java反射是什么?看这篇绝对会了!
  7. android 日历_适用于Android的十大最佳日历应用
  8. scala unix时间戳_下载,在Linux,Unix,Windows上安装Scala
  9. python字符串find_Python字符串find()
  10. 2018年度报告单_2018年度最佳在线IT课程