leetcode 236. 二叉树的最近公共祖先LCA(后序遍历,回溯)
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(后序遍历,回溯)相关推荐
- 力扣(LeetCode)236. 二叉树的最近公共祖先(C语言)
一.环境说明 本文是 LeetCode 236. 二叉树的最近公共祖先,使用c语言实现. 递归. 测试环境:Visual Studio 2019. 二.代码展示 精简代码: struct TreeNo ...
- leetcode 236. 二叉树的最近公共祖先 递归解法 c语言
如题: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x, 满足 x 是 p.q ...
- leetcode 236. 二叉树的最近公共祖先 思考分析
目录 题目 思考分析 改进 本文章代码思路来源于公众号[代码随想录] 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个 ...
- LeetCode 236. 二叉树的最近公共祖先
文章目录 解法1:保存祖先节点+逐个判断 解法2:深度优先遍历 解法3:记录祖先节点 https://leetcode-cn.com/problems/lowest-common-ancestor-o ...
- 最近公共祖先_[LeetCode] 236. 二叉树的最近公共祖先
题目链接: https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree 难度:中等 通过率:57.2% 题目描述: ...
- Leetcode 236.二叉树的最近公共祖先
Time: 20190907 Type: Medium 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p. ...
- [leetcode]236.二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x 是 p.q 的祖先且 ...
- LeetCode 236. 二叉树的最近公共祖先(递归)
题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q ...
- 【LeetCode】【HOT】236. 二叉树的最近公共祖先(递归)
[LeetCode][HOT]236. 二叉树的最近公共祖先 文章目录 [LeetCode][HOT]236. 二叉树的最近公共祖先 package hot;class TreeNode{int va ...
最新文章
- 设置linux查看历史命令显示两个小时内,linux系统中history历史命令显示执行日期和时间...
- 取一列_excel工作案例:如何快速实现一列变两列?
- C# Linq获取两个List或数组的差集交集
- 家长必读:不想逼孩子,你应该这样做
- 真格量化——GFTD策略
- java绘制流程图_如何才能更好地绘制计算机毕业设计中各种图表
- MATLAB基础教程(6)——使用matlab求解线性方程组
- 2018 ios开发者账号同意新协议加联系电话教程
- Linux学习总结(79)—— Shell 编程规范
- Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解决方案
- 高中计算机网络培训心得体会,高中老师信息技术培训心得体会
- MFC入门之 Ribbon界面设计
- linux上安装安卓厨房手机版,【图片】【教程】进阶教程之“使用安卓厨房制作/修改ROM包”【联想a798t吧】_百度贴吧...
- Action语义学综述
- FLASH寿命问题说明
- ThinkPad E431 Bluetooth驱动
- 西瓜书读书笔记(一)
- git stash '储藏'当前工作状态
- 【零散知识】核密度估计(Kernel Density Estimation)
- 纺织企业举步维艰,小微纺织企业该如何做?
热门文章
- AI队列长度检测:使用Keras进行对象检测
- 使用CancellationToken——而不是Thread.Sleep
- 深度操作系统 Deepin 20 BETA 发布
- 有关Visual Studio Code的说明
- 我对这个页面做了什么?
- django 如何写model
- springboot的一些基层原理 2021-05-28
- 大数据导论章节答案_智慧树大数据导论章节答案
- ionic4页面常用判断
- thincmf 分页无法搜索_分页的bug ThinkCMF内容管理框架,做最简约的ThinkPHP开源软件...