对于二叉树中任意两个结点p和q,可能存在如下的情形:

  • p是q的祖先,此时p是p和q的最近公共祖先
  • q是p的祖先,此时q是p和q的最近公共祖先
  • p和q没有父子关系。

如果设p和q的最近公共祖先为x。如果x是p和q的公共祖先(不一定是最近的),应该会满足如下条件:

  • x == p,且x的左子树或右子树包含结点q
  • x== q,且x的左子树或右子树包含结点p
  • x的左子树包含结点q,且右子树包含结点p或相反。

考虑采用后续遍历来确定最近公共祖先。

  • 当遍历到结点p(或q)时,递归向上返回说明已经找到了结点p(或q)
  • 当遍历到结点q(或p)时,观察其左右子树的返回结果是否说明包含结点p或(q)
    • 如果是,则q(或p)就是最终结果
    • 否则继续逐层向上返回,直到某个结点的左右子树返回结果都说明了包含p或q
  • 这样的算法结果就是最近公共祖先,因为是左右子树同一次返回包含p或q就确定了结果
class Solution {boolean find = false;public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null)return null;TreeNode left = lowestCommonAncestor(root.left,p,q);if(find)return left;TreeNode right = lowestCommonAncestor(root.right,p,q);if(find)return right;if((left == p || root == p) && (right == q || root == q)  || (root == q || left == q) && (root == p || right == p)){find  =  true;return root;}if(root == p || left == p || right == p)return p;if(root == q || left == q || right == q)return q;return null;}
}

二叉树中的最近公共祖先相关推荐

  1. python代码实现二叉树中最低的公共祖先

    python代码实现二叉树中最低的公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结 ...

  2. 十九、二叉树的最近的公共祖先

    十九.二叉树的最近的公共祖先 文章目录 十九.二叉树的最近的公共祖先 题目描述 解题思路 上机代码: 题目描述 设顺序存储的二叉树中有编号为 i 和 j 的两个结点,请设计算法求出它们最近的公共祖先结 ...

  3. 7-6 顺序存储的二叉树的最近的公共祖先问题 (10 分)

    7-6 顺序存储的二叉树的最近的公共祖先问题 (10 分) 设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值. 输入格式: 输入第1行给出正整数n(≤100 ...

  4. 顺序存储的二叉树的最近的公共祖先问题

    习题4.5 顺序存储的二叉树的最近的公共祖先问题 (25 分) 设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值. 输入格式: 输入第1行给出正整数n(≤1 ...

  5. 7-4 (小字辈) 7-5 (列出叶结点) 7-6 (顺序存储的二叉树的最近的公共祖先问题)

    目录 7-4 小字辈 7-5 列出叶结点 7-6 顺序存储的二叉树的最近的公共祖先问题 总结: 7-4 小字辈 原题链接:题目详情 - 7-4 小字辈 (pintia.cn) 思路: 利用一维数组下标 ...

  6. 二叉树:最近的公共祖先 Lowest Common Ancestor of a Binary Tree

    已知二叉树,求二叉树中给定的两个节点的最近公共祖先. 最近公共祖先: 两节点v与w的最近公共祖先u,满足在树上最低(离根最 远),且v,w两个节点都是u的子孙. 如上二叉树,6和8号节点的公共祖先有4 ...

  7. 7-5 顺序存储的二叉树的最近的公共祖先问题(25 分)

    设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值. 输入格式: 输入第1行给出正整数n(≤),即顺序存储的最大容量:第2行给出n个非负整数,其间以空格分隔. ...

  8. 【学透二叉树-二叉搜索树(二叉树)的最近公共祖先】

    示例: 代码实现: class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q ...

  9. 1143 Lowest Common Ancestor (30 分)【难度: 中 / 知识点: 最低公共祖先 未完成】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343727501312

最新文章

  1. Java如何比较两个字符串(对象)是否相等
  2. 国内整车厂“造芯”还缺什么?
  3. winserver2008 Oracle 11g 安装
  4. 创新实训团队记录:为BR-MTC问题设计一个近似算法
  5. 创建Maven项目时实际使用JDK为1.8,该怎样修改其默认的JDK1.5
  6. python--pandas 分位数
  7. ausam3x 嵌入式linux,ATSAM3X8EA-AU - 微控制器, 32位, SAM3X系列, ARM 皮质-M3, 84nb
  8. mysql 停数据库_mysql数据库突然停了
  9. C++的掐拷贝、深拷贝【面向对象程序设计细节】
  10. 经历一次方知书中千百蕴意 ——读《人月神话》有感
  11. vmware16安装mac虚拟机的unlocker
  12. MSN 通信协议学习笔记(转)
  13. 聊一聊机器学习的MLE和MAP:最大似然估计和最大后验估计
  14. 基于嵌入式技术的智能灌溉系统设计与实现
  15. 赶上时代步伐,我们也来做“菱形图片”
  16. python vimdiff_vimdiff使用技巧
  17. ssm毕设项目基于Javaweb的宠物救助网站s6a19(java+VUE+Mybatis+Maven+Mysql+sprnig)
  18. win11家庭版如何彻底关闭病毒实时保护
  19. 3.会计等式与复式记账
  20. MATLAB求解非齐次线性方程组

热门文章

  1. 记忆犹新的定时任务的bug
  2. 基于单片机温湿度光照自动窗帘系统设计(毕业设计资料)
  3. CSP-J2019第二轮 解题分析
  4. 2020年司钻(井下)考试题库及司钻(井下)考试APP
  5. 限时订单实现方案(DelayQueue、ActiveMq)
  6. 图像特征提取与匹配——SIFT算法
  7. 观点五、史上首次揭露广告的真相
  8. 前端网络——get和post的区别
  9. 项目管理五大过程与十大知识领域
  10. 阿里云王牌架构师杨曦:也谈系统缓存设计误区及高阶使用技巧