LeetCode 235: 二叉搜索树的最近公共祖先
二叉搜索树的最近公共祖先
题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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: 二叉搜索树的最近公共祖先相关推荐
- leetcode 235. 二叉搜索树的最近公共祖先(Java版,树形dp套路)
题目 原题地址:leetcode 235. 二叉搜索树的最近公共祖先 说明: 所有节点的值都是唯一的. p.q 为不同节点且均存在于给定的二叉搜索树中. 题解 关于 树形dp 套路,可以参考我的另一篇 ...
- leetcode —— 235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖 ...
- Leetcode 235.二叉搜索树的最近公共祖先
Time: 20190907 Type: Easy 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p. ...
- leetcode 235. 二叉搜索树的最近公共祖先
给定一棵二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义: "对于有根树T的两个结点u.v,最近公共祖先表示一个结点x,满足x是u.v的祖先且x的深度尽可能 ...
- leetcode 235. 二叉搜索树的最近公共祖先 思考分析
目录 题目 思考 迭代法 题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 ...
- LeetCode 235. 二叉搜索树的最近公共祖先(递归)
题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p ...
- ( “树” 之 BST) 235. 二叉搜索树的最近公共祖先 ——【Leetcode每日一题】
二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. ...
- 二叉树part8 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
文章目录 235. 二叉搜索树的最近公共祖先 思路 代码 困难 701.二叉搜索树中的插入操作 思路 代码 450.删除二叉搜索树中的节点 思路 代码 困难 今日收获 235. 二叉搜索树的最近公共祖 ...
- 【C语言刷LeetCode】235. 二叉搜索树的最近公共祖先(E)
[ 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q ...
- 【Leetcode | 235】 235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖 ...
最新文章
- 【Java 网络编程】Socket TCP UDP 联系
- MySql折腾小记二:text/blog类型不允许设置默认值,不允许存在两个CURRENT_TIMESTAMP...
- apache 的工作模式
- 温网告别了两位美女:伊万和莎娃
- zookeeper 入门讲解实例 转
- JEECG - 基于代码生成器的J2EE智能开发框架 续六: JEECG 前台页面和后台交互讲解
- Mybatis(4)入门案例中设计模式分析
- 千亿云计算产业加速跑 多云管理助推上云率
- 小白也能看懂的 Java 异常处理
- 最简单的YUV422转jpg的例程
- GNS3新手安装教程
- 生成函数学习笔记心得
- bugku之江湖魔头
- AI 人工智能学习之泰勒公式与拉格朗日乘数法
- 计算机游戏act指的是什么游戏,忍龙2领衔!5款史上最佳的ACT游戏推荐,值得一玩!...
- 基于学生信息管理系统的数据库系统课程设计升级版(mysql)
- 普适计算的六大必备条件
- python shapely
- python全局变量和局部变量可以同名吗_Python global
- 设置图片格式为php,php实现图片格式转换