给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

输入: root = [,,,,,,,null,null,,], p = , q =
输出:
解释: 节点 和节点 的最近公共祖先是 。
输入: root = [,,,,,,,null,null,,], p = , q =
输出:
解释: 节点 和节点 的最近公共祖先是 , 因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

要获取两个节点的最近公共祖先,其实就是获取两个节点到root的路径中,最早相遇的地方,但是我们从p或者q到root的路径是比较麻烦的,除非我们有一个父亲指针

那我们其实可以从root开始找,判断左子树或者右子树是否有p或者q

如图所示,我们需要递归找到所有子树中是否有p或者q,如果都找到,那就是对应的祖先

func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root == nil || root == p || root == q {
return root
}
left := lowestCommonAncestor(root.Left, p, q)
right := lowestCommonAncestor(root.Right, p, q)
if left == nil {
return right
} else if right == nil {
return left
} else {
return root
}
}

最新文章

  1. api接口类型
  2. @autowired和@resource的区别
  3. bootstrap的介绍 和使用
  4. C# mongodb 驱动操作(Z)
  5. mac 安装jdk1.5
  6. C# WebApi 请求方式Post,返回Response
  7. HTTP Pipeline
  8. STM32 SPI DMA 的使用
  9. BZOJ3308 九月的咖啡店
  10. Parallax Occlusion Mapping
  11. 《Android内核剖析》读书笔记 第13章 View工作原理【View重绘过程】
  12. java程序开发代写(QQ:928900200)
  13. android user如何打开一个版本号root才干
  14. JavaSE教程-02Java基本语法-BUG:易错点
  15. HDU1005 找规律 or 循环点 or 矩阵快速幂
  16. swift 创建九宫格在后面加按钮
  17. CSS揭秘(四)视觉效果
  18. js实现八皇后,回溯法
  19. ES6躬行记(16)——Set
  20. HTML: Dom event

热门文章

  1. IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可)
  2. 深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件
  3. 前端笔记之jQuery(下)事件&节点操作&净位置&拖拽&页面卷动值&遍历JSON
  4. golang slice 使用及源码分析
  5. 【ASP.NET Core快速入门】(七)WebHost的配置、 IHostEnvironment和 IApplicationLifetime介绍、dotnet watch run 和attach到进程调试
  6. Linux下 Vim(Vi)编辑器的使用
  7. gcc编译基本用法~1
  8. leetcode — word-ladder
  9. LeetCode专题-Python实现之第1题:Two Sum
  10. Docker最全教程——从理论到实战(四)