此问题也成为LCA问题
题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 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 。
示例 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

解决办法:

临界条件
(1)判断根结点是否是空节点,如果是,那么肯定就可以马上返回了
(2)如果根结点就等于q结点或p结点的情况如果根结点为二者之一,那么根结点就必定是最近公共祖先了,这时直接返回root即可
如果上面两种情况都不是,那么就分别进入到根节点的左边和右边进行递归遍历,以下分为四种情况:
第一种情况:左子树和右子树均找没有p结点或者q结点;
第二种情况:左子树上能找到,但是右子树上找不到,此时就应当直接返回左子树的查找结果;
第三种情况:右子树上能找到,但是左子树上找不到,此时就应当直接返回右子树的查找结果;
第四种情况:左右子树上均能找到,说明此时的p结点和q结点分居root结点两侧,此时就应当直接返回root结点了。


/***  1.首先判断q或者q是不是当前的根,如果是,则直接返回当前根*  2.如果不是,那么分别取左边和右边去找*  (2.1)如果左边不为空,右边也不为空,那么根就是祖先*  (2.2)如果左边不为空,右边为空,那么左边遇到的第一个节点就是公共祖先*  (2.3)如果左边为空,右边不为空,那么右边遇到的第一个节点就是公共祖先*/public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null){return null;}if(root == p || root == q){return root;}TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(left != null && right !=null){return root;}if(left != null && right == null){return left;}if(left == null && right != null){return right;}return null;}

LeetCode——二叉树的最近公共祖先相关推荐

  1. LeetCode 1676. 二叉树的最近公共祖先 IV

    文章目录 1. 题目 2. 解题 1. 题目 给定一棵二叉树的根节点 root 和 TreeNode 类对象的数组(列表) nodes,返回 nodes 中所有节点的最近公共祖先(LCA). 数组(列 ...

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

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

  3. 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先

    [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 一.DFS 一.DFS 祖先的定义 ...

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

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

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

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

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

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

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

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

  8. 奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)...

    1. 二叉树最近公共祖先 奇安信集团 2020校招 服务端开发-应用开发方向在线考试 编程题|20分2/2 寻祖问宗 时间限制:C/C++语言 1000MS:其他语言 3000MS 内存限制:C/C+ ...

  9. 代码随想录算法训练营第22天 二叉树 java :235. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

    文章目录 LeetCode 236. 二叉树的最近公共祖先 题目讲解 思路 LeetCode 701.二叉搜索树中的插入操作 题目讲解 思路 LeetCode 450.删除二叉搜索树中的节点 题目讲解 ...

最新文章

  1. 数据结构与算法常用名词术语整理
  2. 第39次《中国互联网络发展状况统计报告》发布
  3. 初步学习Linux文件基本属性和Cygwin STATUS_ACCESS_VIOLATION 错误
  4. 【car】买车时保险的坑
  5. Web内核微信小程序框架实践
  6. Linux应用程序在内存中的地址布局
  7. Linux 下的Core Dump
  8. what's the difference between atime, ctime and mtime
  9. 评论家:亚马逊先于苹果达万亿美元市值
  10. mysql数据库备份还原表_MySQL数据库及表的备份与还原_MySQL
  11. Vector Packet Processor(VPP) - 层二层三转发图谱
  12. 7-4 sdut-运输计费问题 (10 分)python
  13. 计算机一级信息技术基础知识,计算机一级考试之信息技术基础.doc
  14. 2016.1.20 总结(for语句,选择语句和循环语句混合使用)
  15. JQuery之基本操作
  16. Meclipse乱码解决方案
  17. Qt 学习(四) —— qrc资源文件介绍与使用
  18. 大学计算机vb基础知识6,西华师范大学计算机VB试题及答案6
  19. JVM(十) - 性能调优
  20. 随机在数组中抽取两个数据

热门文章

  1. 一般绘CAD图用计算机配置,cad图形界限一般是多少
  2. 组合日期_为什么我的透视表没法按日期组合?
  3. 创建 demo.html,demo.html
  4. 芯片业巨震!英特尔拟90亿美元卖掉NAND闪存业务
  5. 使用负载均衡SLB时为何出现请求分布不均衡的现象
  6. 后端人员如何应对线上故障
  7. php图片生成缩略图_php实现根据url自动生成缩略图的方法
  8. python并列语句_Python基础_控制语句
  9. 技术中台构建思路及进展_半年中台实践思考:落地中台,贵在其神,活用其形...
  10. mysql relay log 配置_mysql relay log参数汇总