二叉搜索树的最近公共祖先

题目描述:

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

百度百科中最近公共祖先的定义为:“对于有根树 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, 因为根据定义最近公共祖先节点可以为节点本身。

链接:

235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com)

解题思路

二叉搜索树的特点就是 左子树的所有节点都小于当前节点,右子树的所有节点都大于当前节点,并且每棵子树都具有上述特点

思路一:非递归解决

  • 如果两个节点值都小于根节点,说明他们都在根节点的左子树上,我们往左子树上找
  • 如果两个节点值都大于根节点,说明他们都在根节点的右子树上,我们往右子树上找
  • 如果一个节点值大于根节点,一个节点值小于根节点,说明他们他们一个在根节点的左子树上一个在根节点的右子树上,那么根节点就是他们的最近公共祖先节点
/*** @param {TreeNode} root* @param {TreeNode} p* @param {TreeNode} q* @return {TreeNode}*/
var lowestCommonAncestor = function(root, p, q) {// 如果根节点和p,q的差相乘是正数,说明这两个差值要么都是正数要么都是负数,也就是说// 它们肯定都位于根节点的同一侧,就继续往下找while ((root.val - p.val) * (root.val - q.val) > 0)root = p.val < root.val ? root.left : root.right;// 如果相乘的结果是负数,说明p和q位于根节点的两侧,如果等于0,说明至少有一个就是根节点return root;
};

时间复杂度: O(n)

空间复杂度: O(1)

思路二:递归解决

/*** @param {TreeNode} root* @param {TreeNode} p* @param {TreeNode} q* @return {TreeNode}*/
var lowestCommonAncestor = function(root, p, q) {// 如果小于等于0,说明p和q位于root的两侧,直接返回即可if ((root.val - p.val) * (root.val - q.val) <= 0) return root;// 否则,p和q位于root的同一侧,就继续往下找return lowestCommonAncestor(p.val < root.val ? root.left : root.right, p, q);
}; 

时间复杂度:O(n)

空间复杂度:O(1)

参考资料:

力扣

LeetCode 235: 二叉搜索树的最近公共祖先相关推荐

  1. leetcode 235. 二叉搜索树的最近公共祖先(Java版,树形dp套路)

    题目 原题地址:leetcode 235. 二叉搜索树的最近公共祖先 说明: 所有节点的值都是唯一的. p.q 为不同节点且均存在于给定的二叉搜索树中. 题解 关于 树形dp 套路,可以参考我的另一篇 ...

  2. leetcode —— 235. 二叉搜索树的最近公共祖先

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

  3. Leetcode 235.二叉搜索树的最近公共祖先

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

  4. leetcode 235. 二叉搜索树的最近公共祖先

    给定一棵二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义: "对于有根树T的两个结点u.v,最近公共祖先表示一个结点x,满足x是u.v的祖先且x的深度尽可能 ...

  5. leetcode 235. 二叉搜索树的最近公共祖先 思考分析

    目录 题目 思考 迭代法 题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 ...

  6. LeetCode 235. 二叉搜索树的最近公共祖先(递归)

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

  7. ( “树” 之 BST) 235. 二叉搜索树的最近公共祖先 ——【Leetcode每日一题】

    二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. ...

  8. 二叉树part8 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

    文章目录 235. 二叉搜索树的最近公共祖先 思路 代码 困难 701.二叉搜索树中的插入操作 思路 代码 450.删除二叉搜索树中的节点 思路 代码 困难 今日收获 235. 二叉搜索树的最近公共祖 ...

  9. 【C语言刷LeetCode】235. 二叉搜索树的最近公共祖先(E)

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

  10. 【Leetcode | 235】 235. 二叉搜索树的最近公共祖先

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

最新文章

  1. 【Java 网络编程】Socket TCP UDP 联系
  2. MySql折腾小记二:text/blog类型不允许设置默认值,不允许存在两个CURRENT_TIMESTAMP...
  3. apache 的工作模式
  4. 温网告别了两位美女:伊万和莎娃
  5. zookeeper 入门讲解实例 转
  6. JEECG - 基于代码生成器的J2EE智能开发框架 续六: JEECG 前台页面和后台交互讲解
  7. Mybatis(4)入门案例中设计模式分析
  8. 千亿云计算产业加速跑 多云管理助推上云率
  9. 小白也能看懂的 Java 异常处理
  10. 最简单的YUV422转jpg的例程
  11. GNS3新手安装教程
  12. 生成函数学习笔记心得
  13. bugku之江湖魔头
  14. AI 人工智能学习之泰勒公式与拉格朗日乘数法
  15. 计算机游戏act指的是什么游戏,忍龙2领衔!5款史上最佳的ACT游戏推荐,值得一玩!...
  16. 基于学生信息管理系统的数据库系统课程设计升级版(mysql)
  17. 普适计算的六大必备条件
  18. python shapely
  19. python全局变量和局部变量可以同名吗_Python global
  20. 设置图片格式为php,php实现图片格式转换

热门文章

  1. Node-express项目--个人简历:搭建posts接口并实现评论、点赞以及相关功能
  2. 手表频率测试软件,细数智能手表中的16个传感器
  3. Keras中dense层原理及用法解释
  4. Discuz!顶置贴、帖子列表优化建议
  5. Ubuntu AppImage格式安装、卸载
  6. Python文本处理:单词提取和统计,借助matplotlib绘图
  7. [英语阅读]麦道夫玩偶配锤子 怨他就砸他
  8. uni-app上传图片(选择,预览,删除图片)
  9. unity中MVP模式学习
  10. 个人服务器(Linux)安装confluence