题目

面试题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.二叉搜索树的最近公共祖先相关推荐

  1. [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

    [问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...

  2. [剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]

    [问题描述][第235题][二叉搜索树的最近公共祖先][简单] 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p. ...

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

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

  4. 【LeetCode】剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

    [LeetCode]剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 一.迭代 二.递归 祖先的定义 ...

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

    目录 二叉搜索树的最近公共祖先(力扣:235) 二叉树的最近公共祖先(力扣:236) 二叉搜索树的最近公共祖先 题目 二叉搜索树的最近公共祖先(力扣:235) 给定一个二叉搜索树, 找到该树中两个指定 ...

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

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

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

    题目链接: 235. 二叉搜索树的最近公共祖先 大概思路: 题目要求: 给定一颗二叉搜索树,两个确定值q,p,要求q,p的最近公共祖先. 思路: 利用搜索树的特性,当q,p的值均小于遍历的节点值的时候 ...

  8. LeetCode 235: 二叉搜索树的最近公共祖先

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

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

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

  10. 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图

    目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...

最新文章

  1. 《Advanced PHP Programming》读书笔记
  2. 电脑维修的十大原则,你都认同吗?
  3. for mew歌词 shell_求shell for mew的中文歌词
  4. ubuntu12.04英文环境下配置ibus遇到的问题
  5. 简单的redis使用watch完成秒杀抢购功能
  6. 电路设计中的防爆设计原理与注意事项分析
  7. vs2010插件之VisualSVN
  8. IM即时通讯实现原理
  9. 参考计算机科学导论的毕业论文,计算机学科导论论文
  10. python调用c++的方法,加速运算
  11. 【CS231n】A Few Useful Things to Know about Machine Learning全文翻译
  12. 大中型企业建立IT服务台的意义及实践
  13. Echarts中tooltip显示的数据与数据本身顺序相反
  14. 3.额外器件-光场相机
  15. QTimer定时器问题分析
  16. 7-2 点赞(20 分)
  17. 概览嵌入式系统的各种周边设备
  18. 美团Java开发实习生面经
  19. Android 源码系列之二十通过反射解决在HuaWei手机出现Register too many Broadcast Receivers的crash
  20. 如何把爱心图片变成“伪像素风”?用 CSS 贼容易!

热门文章

  1. 初学django框架
  2. Python成长笔记 - 基础篇 (七)python面向对象
  3. Spring中EmptyResultDataAccessException异常产生的原理及处理方法
  4. 记录一枚验证URL的js正则表达式
  5. Boost Asio 使用技巧
  6. Hibernate框架入门
  7. JavaWeb知识点
  8. 每天一道剑指offer-顺时针打印矩阵
  9. java 微信导航栏_微信小程序教程系列之设置标题栏和导航栏
  10. oracle-merge语法