LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先。

题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

递归1

 后序遍历,回溯

  对每个节点对应的子树,若该子树不含有p或q,返回nullptr;否则,如果p和q分别位于当前子树根节点两侧,则返回当前节点,否则(p和q在同一侧,或者只有某一侧有p或q)返回来自左边或右边的LCA。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
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 && right!=null) return root;return left!=null ? left : right;}
}

递归法2

思路

二叉树做后序遍历,回溯:回溯时: 捕获mid,即当前节点是否为p或q; 当 left right mid 三个中有两个为True时,说明当前节点是最近的公共节点,记录至res;返回值: 左子树或右子树或当前节点中包含p或q;
最终,返回最近公共节点res。

class Solution {TreeNode res = null;public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {dfs(root, p, q);return res;}private int dfs(TreeNode root, TreeNode p, TreeNode q){if(root == null) return 0;int left = dfs(root.left, p, q);int right = dfs(root.right, p, q);int mid = root == p || root == q ? 1 : 0;if(left + right + mid > 1) res = root;return left + right + mid > 0 ? 1 : 0;}
}

转载于:https://www.cnblogs.com/haimishasha/p/11512567.html

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

  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. 二叉树的最近公共祖先 思考分析

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

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

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

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

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

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

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

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

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

  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. 设置linux查看历史命令显示两个小时内,linux系统中history历史命令显示执行日期和时间...
  2. 取一列_excel工作案例:如何快速实现一列变两列?
  3. C# Linq获取两个List或数组的差集交集
  4. 家长必读:不想逼孩子,你应该这样做
  5. 真格量化——GFTD策略
  6. java绘制流程图_如何才能更好地绘制计算机毕业设计中各种图表
  7. MATLAB基础教程(6)——使用matlab求解线性方程组
  8. 2018 ios开发者账号同意新协议加联系电话教程
  9. Linux学习总结(79)—— Shell 编程规范
  10. Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解决方案
  11. 高中计算机网络培训心得体会,高中老师信息技术培训心得体会
  12. MFC入门之 Ribbon界面设计
  13. linux上安装安卓厨房手机版,【图片】【教程】进阶教程之“使用安卓厨房制作/修改ROM包”【联想a798t吧】_百度贴吧...
  14. Action语义学综述
  15. FLASH寿命问题说明
  16. ThinkPad E431 Bluetooth驱动
  17. 西瓜书读书笔记(一)
  18. git stash '储藏'当前工作状态
  19. 【零散知识】核密度估计(Kernel Density Estimation)
  20. 纺织企业举步维艰,小微纺织企业该如何做?

热门文章

  1. AI队列长度检测:使用Keras进行对象检测
  2. 使用CancellationToken——而不是Thread.Sleep
  3. 深度操作系统 Deepin 20 BETA 发布
  4. 有关Visual Studio Code的说明
  5. 我对这个页面做了什么?
  6. django 如何写model
  7. springboot的一些基层原理 2021-05-28
  8. 大数据导论章节答案_智慧树大数据导论章节答案
  9. ionic4页面常用判断
  10. thincmf 分页无法搜索_分页的bug ThinkCMF内容管理框架,做最简约的ThinkPHP开源软件...