算法笔记_面试题_12.二叉搜索树的最近公共祖先
题目
面试题68 - I. 二叉搜索树的最近公共祖先
难度:简单
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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, 因为根据定义最近公共祖先节点可以为节点本身。说明:所有节点的值都是唯一的。p、q 为不同节点且均存在于给定的二叉搜索树中。
解法1:递归
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if ((root->val - p->val) * (root->val - q->val) <= 0) return root; //递归结束条件 else if (root->val > p->val) return lowestCommonAncestor(root->left, p, q);else return lowestCommonAncestor(root->right, p, q);
}
解法1解析
- 递推:
- 若p,q一个在root的左子树,一个在root的右子树,或者有一个的值等于当前root的值,则找到目标,返回当前root;
- 当root值都大于 p,q ,即都在 root 的左子树中,则开启递归 root.left 并返回;
- 当 root值都小于 p,q ,即都在 root 的右子树中,则开启递归 root.right并返回;
- 退出递归的返回值: 最近公共祖先 root 。
- 复杂度分析:
- 时间复杂度 O(N) : 其中 N 为二叉树节点数;每循环一轮排除一层,二叉搜索树的层数最小为 logN (满二叉树),最大为 N (退化为链表)。
- 空间复杂度 O(N) : 最差情况下,即树退化为链表时,递归深度达到树的层数 N 。
解法2:迭代
注意点:区别于递归,1)使用while循环遍历这个树,2)改变的是root值,3)最后要有默认返回root
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {while(root != NULL){if ((root->val - p->val) * (root->val - q->val) <= 0) return root; //异号或有相等的else if (root->val > p->val) root = root->left; else root = root->right; }return root;
}
解法2解析
- 循环搜索:
- 当 p, q 都在 rootroot 的 右子树 中,则遍历至 root.right ;
- 否则,当 p, q 都在 rootroot 的 左子树 中,则遍历至 root.left;
- 否则,说明找到了 最近公共祖先 ,跳出。
- 返回值: 最近公共祖先 root 。
- 复杂度分析:
- 时间复杂度 O(N): 其中 N 为二叉树节点数;每循环一轮排除一层,二叉搜索树的层数最小为 logN (满二叉树),最大为 N (退化为链表)。
- 空间复杂度 O(1) : 使用常数大小的额外空间。
算法笔记_面试题_12.二叉搜索树的最近公共祖先相关推荐
- [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]
[问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...
- [剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]
[问题描述][第235题][二叉搜索树的最近公共祖先][简单] 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p. ...
- leetcode 235. 二叉搜索树的最近公共祖先(Java版,树形dp套路)
题目 原题地址:leetcode 235. 二叉搜索树的最近公共祖先 说明: 所有节点的值都是唯一的. p.q 为不同节点且均存在于给定的二叉搜索树中. 题解 关于 树形dp 套路,可以参考我的另一篇 ...
- 【LeetCode】剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
[LeetCode]剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 一.迭代 二.递归 祖先的定义 ...
- 二叉搜索树的最近公共祖先、二叉树的最近公共祖先
目录 二叉搜索树的最近公共祖先(力扣:235) 二叉树的最近公共祖先(力扣:236) 二叉搜索树的最近公共祖先 题目 二叉搜索树的最近公共祖先(力扣:235) 给定一个二叉搜索树, 找到该树中两个指定 ...
- ( “树” 之 BST) 235. 二叉搜索树的最近公共祖先 ——【Leetcode每日一题】
二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. ...
- 24. 二叉搜索树的最近公共祖先
题目链接: 235. 二叉搜索树的最近公共祖先 大概思路: 题目要求: 给定一颗二叉搜索树,两个确定值q,p,要求q,p的最近公共祖先. 思路: 利用搜索树的特性,当q,p的值均小于遍历的节点值的时候 ...
- LeetCode 235: 二叉搜索树的最近公共祖先
二叉搜索树的最近公共祖先 题目描述: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一 ...
- 二叉树part8 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
文章目录 235. 二叉搜索树的最近公共祖先 思路 代码 困难 701.二叉搜索树中的插入操作 思路 代码 450.删除二叉搜索树中的节点 思路 代码 困难 今日收获 235. 二叉搜索树的最近公共祖 ...
- 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图
目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...
最新文章
- 《Advanced PHP Programming》读书笔记
- 电脑维修的十大原则,你都认同吗?
- for mew歌词 shell_求shell for mew的中文歌词
- ubuntu12.04英文环境下配置ibus遇到的问题
- 简单的redis使用watch完成秒杀抢购功能
- 电路设计中的防爆设计原理与注意事项分析
- vs2010插件之VisualSVN
- IM即时通讯实现原理
- 参考计算机科学导论的毕业论文,计算机学科导论论文
- python调用c++的方法,加速运算
- 【CS231n】A Few Useful Things to Know about Machine Learning全文翻译
- 大中型企业建立IT服务台的意义及实践
- Echarts中tooltip显示的数据与数据本身顺序相反
- 3.额外器件-光场相机
- QTimer定时器问题分析
- 7-2 点赞(20 分)
- 概览嵌入式系统的各种周边设备
- 美团Java开发实习生面经
- Android 源码系列之二十通过反射解决在HuaWei手机出现Register too many Broadcast Receivers的crash
- 如何把爱心图片变成“伪像素风”?用 CSS 贼容易!