【数据结构系列】——最近公共祖先问题
Git中关于最近公共祖先问题的应用:
Git
的rebase
工作方式告诉我们一个经典算法问题:最近公共祖先(LCA)Lowest Common Ancestor
比如:git pull命令,默认是使用merge方式将远端别人修改拉到本地,如果带上参数git pull -r,就会使用rebase的方式将远端修改拉到本地。
两者直观的区别是:merge方式合并的分支会有很多“分支”、而rebase方法合并的分支就是一条直线
对于多人协作,merge方式并不友好,处在dev分支,使用git rebase master,Git会把dev接到master分支上,即
首先找到这两条分支的最近公共祖先LCA,然后从master节点开始,重演LCA到dev几个commit的修改,最后结果就是把dev的分支完全接到master上面。
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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。因为根据定义最近公共祖先节点可以为节点本身。
class Solution {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 null;return left == null ? right : left;}
}
二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root.val < p.val && root.val < q.val)return lowestCommonAncestor(root.right, p, q);if(root.val > p.val && root.val > q.val)return lowestCommonAncestor(root.left, p, q);return root;}
}
最深叶节点的最近公共祖先
给你一个有根节点的二叉树,找到它最深的叶节点的最近公共祖先。
回想一下:
- 叶节点 是二叉树中没有子节点的节点
- 树的根节点的 深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 d+1
- 如果我们假定 A 是一组节点 S 的 最近公共祖先,S 中的每个节点都在以 A 为根节点的子树中,且 A 的深度达到此条件下可能的最大值。
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4]
输出:[2,7,4]
解释:
我们返回值为 2 的节点,在图中用黄色标记。
在图中用蓝色标记的是树的最深的节点。
注意,节点 6、0 和 8 也是叶节点,但是它们的深度是 2 ,而节点 7 和 4 的深度是 3 。
示例 2:
输入:root = [1]
输出:[1]
解释:根节点是树中最深的节点,它是它本身的最近公共祖先。
示例 3:
输入:root = [0,1,3,null,2]
输出:[2]
解释:树中最深的叶节点是 2 ,最近公共祖先是它自己。
DFS:
TreeNode res = null;int pre=0;public TreeNode lcaDeepestLeaves_1(TreeNode root) {dfs(root,1);return res;}int dfs(TreeNode node,int depth){if(node==null) return depth;int left=dfs(node.left,depth+1);int right =dfs(node.right,depth+1);if(left==right&&left>=pre){res=node;pre=left;}return Math.max(left,right);}
递归:
public TreeNode lcaDeepestLeaves(TreeNode root) {if (root == null)return null;int left = dfs(root.left);int right = dfs(root.right);if (left == right)return root;else if (left < right)return lcaDeepestLeaves(root.right);return lcaDeepestLeaves(root.left);}private int dfs(TreeNode node) {if (node == null)return 0;return 1 + Math.max(dfs(node.right),dfs(node.left));}
【数据结构系列】——最近公共祖先问题相关推荐
- 数据结构与算法之链表结构寻找p、q最近的公共祖先
链表结构,寻找p.q最近的公共祖先 数据结构与算法之链表结构寻找p.q最近的公共祖先 链表结构,寻找p.q最近的公共祖先 问题 想法 代码 问题 设一棵二叉树的结点结构为(LLINK, INFO, R ...
- LeetCode二叉树系列——236.二叉树的最近公共祖先
一.题目描述: 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表 ...
- 【数据结构周周练】007顺序结构实现完全二叉树操作- 求编号i与j最近公共祖先结点
树型结构是数据结构中学到的第一个一对多的结构,是非常重要的非线性结构,也是比较难的一个结构,由于一叉树是顺序表,三叉树比较复杂,最常用的是二叉树.从这次开始就带领大家走进树的世界. 目录 一.题目 二 ...
- 常考数据结构与算法:在二叉树中找到两个节点的最近公共祖先
题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 假设节点的值都大于0. 比如9,10的最近公共祖先节点是2. 思路: 从根节点开始遍历 ...
- 数据结构-寻找二叉树两节点的最近公共祖先(Java)
寻找最近公共祖先 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 ...
- 0x63.图论 - 树的直径与最近公共祖先
目录 一.树的直径(Diameter) 1.树形DP求树的直径 2.两次BFS/DFS求树的直径 1.POJ 1985.Cow Marathon(DFS求树的直径模板题) 2.AcWing 350. ...
- NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先
系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...
- 从零开始的LCA(最近公共祖先)
清明在机房听学长讲树上差分时提到了 \(LCA\) 这个东西,就顺带着学习了一波.由于本人是个蒟蒻,为了避免出现看不懂自己写的 \(Blog\) 这种情况,文中涉及到的知识和概念都会 概括性地 讲一下 ...
- 【题解】最近公共祖先
描述 前面我们学习过了树这种特殊的数据结构.我们知道除了根结点,树上的每个都有父结点.这里我们提到另外一个概念,祖先 结点.所谓祖先结点,就是父结点的父结点,父结点的父结点的父结点-,所有沿着父亲结点 ...
最新文章
- GitHub分享《深度学习500问》优质资源
- 超融合服务器品牌型号,蓝盾发布云平台!强势加入云计算IT行列
- shell中条件判断if中的-z到-d的意思
- 如何系统学习机器学习?
- java并发编程之美-阅读记录11
- Zookeeper 客户端源码吐血总结
- Hbase的WebUI中的RegionServers不显示集群机器域名
- Linux安装 Screen出现的问题
- 使用 dojo/query
- C#的发展历程第五 - C# 7开始进入快速迭代道路
- 暗影精灵4风扇转速调节_惠普暗影精灵 6、光影精灵 6 游戏本正式发布
- 【Emacs】Emacs for windows基本配置文件【转载】
- python移植到stm32f205_Micropython学习(二)STM32移植
- 安卓手机管理器_手机QQ聊天记录如何导出到电脑上查看并打印
- win10专业版有必要吗_Win10专业版和家庭版系统有什么不同?
- Microsoft FxCop 的设计规则 .
- python和java和c语言的区别-python和c语言的主要区别总结
- 续 Codeforces 596 C Wilbur and Points
- 如何在 MAC 系统下拆分 PDF 页面?
- LoRaEdge LR1120 卫星直连通信解读
热门文章
- oracle 数据库怎么查询,Oracle 数据库基础查询
- 传说中乾隆出给晓岚的妙对
- uni-app H5页面打开地图组件 [system] Map key not configured
- 经典卷积网络——DenseNet代码实现
- Matlab中的round()函数
- 数据算法: Bitmap
- 企业实时通信解决方案
- 【测试经验向】提测质量差 + 测试工期压缩,我要怎么办?
- 相亲交友APP软件开发需要具备哪些功能呢?
- oracle更新报错14402,Oracle GoldenGate 系列:Replicat 进程遇 OCI Error ORA-14402 错误解决办法...