承接二叉搜索树的最近公共祖先。

题目链接:

二叉树的最近公共祖先 - 力扣(LeetCode)​leetcode-cn.com

题目描述:

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

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

解题思路:

在二叉搜索树的最近公共祖先一题中,树是一个二叉搜索树,我们可以很容易知道应该往哪个方向去找节点的位置。但是本题就是一棵普通的数,应该怎么来求解呢?

我们肯定还是要先找到两个节点的位置,再去判断他俩的祖先,用 DFS 就可以了,那具体应该怎么做呢?

我们先看 p, q 是不是根节点,如果是根节点就是最近公共祖先,我们就返回根节点。如果不是,我们分别在左、右子树中查找是否包含 p 或 q,有两种情况:左子树包含 p,右子树包含q;左子树包含 q,右子树包含 p),那么此时的根节点还是最近公共祖先。

而如果左子树包含 p 和 q(往右找的返回值为空),那么到 root->left 中查找,最近公共祖先在左子树里面。

如果右子树包含 p 和 q(往左找的返回值为空),那么到 root->right 中查找,最近公共祖先在右子树里面。

代码如下:

class Solution {public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root || root==p || root==q) {return root;}TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);if(!left) return right;if(!right) return left;return root;}
};

如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. ECCV 2020 DETR:《End-to-End Object Detection with Transformers》论文笔记
  2. 2020\Simulation_2\1.12.5MB
  3. 在ASP.NET Core 2.0中使用CookieAuthentication
  4. k8s高可用集群_搭建高可用集群(初始化和部署keepalived)---K8S_Google工作笔记0055
  5. 图层重命名快捷键_玩转CAD快捷键(大全),一篇文章就够了
  6. mysql年龄数据类型_MySql 数据类型
  7. android桌面工具,不一样的Android桌面小工具
  8. PEER地震库地震波获取方法
  9. web打印POS小票机代码
  10. 解决redhat vmware安装后鼠标不能使用问题
  11. PTA 数据库 mysql 10-198 C1-2新增订单统计信息
  12. Shopee开店首站有哪些站点?虾皮入驻规则
  13. 这家机场扶梯安装“智能管家”,扶梯消毒仪现高招,绝了!
  14. ICESat2学习笔记5 :ICESat-2数据下载
  15. Tesseract OCR简介(三)--安装及参数使用
  16. 小区出入登记记录系统java_一种小区出入管理系统的制作方法
  17. (27)Verilog实现倍频【方法四】
  18. 注入——sql注入命令
  19. JAVA中接口存在的意义
  20. 信息安全(网络安全顶会)

热门文章

  1. stream iterators源代码详解
  2. 如何对抗硬件断点--- 调试寄存器
  3. ubuntu下搭建android开发环境(转载)
  4. 数据库高级知识——索引优化分析(一)
  5. linux的基础知识——全局变量异步I/O
  6. Unity-游戏小地图实战(前述知识点回顾与运用)
  7. 【剑指offer】面试题34:二叉树中和为某一值的路径
  8. Leetcode--135. 发糖果
  9. Leetcode--78. 子集
  10. java 关键字 sizeof_Java 基本数据类型 sizeof 功能