Git中关于最近公共祖先问题的应用:

Gitrebase工作方式告诉我们一个经典算法问题:最近公共祖先(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));}

【数据结构系列】——最近公共祖先问题相关推荐

  1. 数据结构与算法之链表结构寻找p、q最近的公共祖先

    链表结构,寻找p.q最近的公共祖先 数据结构与算法之链表结构寻找p.q最近的公共祖先 链表结构,寻找p.q最近的公共祖先 问题 想法 代码 问题 设一棵二叉树的结点结构为(LLINK, INFO, R ...

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

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

  3. 【数据结构周周练】007顺序结构实现完全二叉树操作- 求编号i与j最近公共祖先结点

    树型结构是数据结构中学到的第一个一对多的结构,是非常重要的非线性结构,也是比较难的一个结构,由于一叉树是顺序表,三叉树比较复杂,最常用的是二叉树.从这次开始就带领大家走进树的世界. 目录 一.题目 二 ...

  4. 常考数据结构与算法:在二叉树中找到两个节点的最近公共祖先

    题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点.   假设节点的值都大于0. 比如9,10的最近公共祖先节点是2. 思路: 从根节点开始遍历 ...

  5. 数据结构-寻找二叉树两节点的最近公共祖先(Java)

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

  6. 0x63.图论 - 树的直径与最近公共祖先

    目录 一.树的直径(Diameter) 1.树形DP求树的直径 2.两次BFS/DFS求树的直径 1.POJ 1985.Cow Marathon(DFS求树的直径模板题) 2.AcWing 350. ...

  7. NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...

  8. 从零开始的LCA(最近公共祖先)

    清明在机房听学长讲树上差分时提到了 \(LCA\) 这个东西,就顺带着学习了一波.由于本人是个蒟蒻,为了避免出现看不懂自己写的 \(Blog\) 这种情况,文中涉及到的知识和概念都会 概括性地 讲一下 ...

  9. 【题解】最近公共祖先

    描述 前面我们学习过了树这种特殊的数据结构.我们知道除了根结点,树上的每个都有父结点.这里我们提到另外一个概念,祖先 结点.所谓祖先结点,就是父结点的父结点,父结点的父结点的父结点-,所有沿着父亲结点 ...

最新文章

  1. GitHub分享《深度学习500问》优质资源
  2. 超融合服务器品牌型号,蓝盾发布云平台!强势加入云计算IT行列
  3. shell中条件判断if中的-z到-d的意思
  4. 如何系统学习机器学习?
  5. java并发编程之美-阅读记录11
  6. Zookeeper 客户端源码吐血总结
  7. Hbase的WebUI中的RegionServers不显示集群机器域名
  8. Linux安装 Screen出现的问题
  9. 使用 dojo/query
  10. C#的发展历程第五 - C# 7开始进入快速迭代道路
  11. 暗影精灵4风扇转速调节_惠普暗影精灵 6、光影精灵 6 游戏本正式发布
  12. 【Emacs】Emacs for windows基本配置文件【转载】
  13. python移植到stm32f205_Micropython学习(二)STM32移植
  14. 安卓手机管理器_手机QQ聊天记录如何导出到电脑上查看并打印
  15. win10专业版有必要吗_Win10专业版和家庭版系统有什么不同?
  16. Microsoft FxCop 的设计规则 .
  17. python和java和c语言的区别-python和c语言的主要区别总结
  18. 续 Codeforces 596 C Wilbur and Points
  19. 如何在 MAC 系统下拆分 PDF 页面?
  20. LoRaEdge LR1120 卫星直连通信解读

热门文章

  1. oracle 数据库怎么查询,Oracle 数据库基础查询
  2. 传说中乾隆出给晓岚的妙对
  3. uni-app H5页面打开地图组件 [system] Map key not configured
  4. 经典卷积网络——DenseNet代码实现
  5. Matlab中的round()函数
  6. 数据算法: Bitmap
  7. 企业实时通信解决方案
  8. 【测试经验向】提测质量差 + 测试工期压缩,我要怎么办?
  9. 相亲交友APP软件开发需要具备哪些功能呢?
  10. oracle更新报错14402,Oracle GoldenGate 系列:Replicat 进程遇 OCI Error ORA-14402 错误解决办法...