【经典算法题】二叉树的最近公共祖先

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

题目描述:Leetcode 0235 二叉搜索树的最近公共祖先

分析

  • 本题的考点:LCA(最近公共祖先)

  • 关于LCA问题可以参考:网址。

  • 因为是二叉搜索树,所以我们可以根据值的大小递归求解。如果两个节点的值都小于根节点的值,则进入左子树搜索;否则若两个节点的值都大于根节点的值,则进入右子树搜索;否则当前根节点就是LCA

代码

  • C++
class Solution {public:TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) {if (!root) return NULL;if (p->val < root->val && q->val < root->val) return lowestCommonAncestor(root->left, p, q);if (p->val > root->val && q->val > root->val) return lowestCommonAncestor(root->right, p, q);return root;}
};
  • Java
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null) return null;if (p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p, q);if (p.val > root.val && q.val > root.val) return lowestCommonAncestor(root.right, p, q);return root;}
}

时空复杂度分析

  • 时间复杂度:O(h)O(h)O(h),h为树高。

  • 空间复杂度:O(h)O(h)O(h)。

Leetcode 0236 二叉树的最近公共祖先

题目描述:Leetcode 0236 二叉树的最近公共祖先

分析

  • 本题的考点:LCA

  • 关于LCA问题可以参考:网址。

  • 后续递归遍历两棵子树,第一次发现某棵子树中既有p又有q,则该子树的根节点为p和q的最近公共祖先。如下图:

代码

  • C++
// 写法一
class Solution {public:TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) {if (!root || root == p || root == q) return root;auto l = lowestCommonAncestor(root->left, p, q), r = lowestCommonAncestor(root->right, p, q);if (l && r) return root;  // 第一次左右非空, 此时对应的root是LCAif (l) return l;return r;  // right也可能为空节点}
};
// 写法二
class Solution {public:TreeNode* ans = NULL;TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) {dfs(root, p, q);return ans;}// 返回值是一个二进制的数,最低位是1的话表示该棵子树存在p,从右向左第二位是1的话表示该棵子树存在q。int dfs(TreeNode *root, TreeNode *p, TreeNode *q) {if (!root) return 0;int state = 0;if (root == p) state |= 1;else if (root == q) state |= 2;state |= dfs(root->left, p, q);state |= dfs(root->right, p, q);if (state == 3 && !ans) ans = root;  // 只有第一次找到的才是LCAreturn state;}
};
  • Java
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null || root == p || root == q) return root;TreeNode left = lowestCommonAncestor(root.left, p, q), right = lowestCommonAncestor(root.right, p, q);if (left != null && right != null) return root;  // 第一次左右非空, 此时对应的root是LCAif (left != null) return left;return right;  // right也肯能为空节点}
}

时空复杂度分析

  • 时间复杂度:O(n)O(n)O(n),n为树中节点数。

  • 空间复杂度:O(h)O(h)O(h),h为树高。

【经典算法题】二叉树的最近公共祖先相关推荐

  1. leetcode算法题--二叉树的最近公共祖先

    原题链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/ TreeNode* lowest ...

  2. 算法攻关 - 二叉树的最近公共祖先 (O(n))_236

    文章目录 一.题目描述 二.思路 三.代码实现 四.小结 一.题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 ...

  3. 经典算法——二叉搜索树的公共祖先节点

    介绍 二叉搜索树的公共祖先节点是指:对于给定的两个节点p.q,向上寻找离二者最近的公共节点. public class Node<T extends Comparable<T>> ...

  4. 刷题记录8---验证二叉搜索树+二叉树的层序遍历+从前序与中序遍历序列构造二叉树+二叉树展开为链表+二叉树的最近公共祖先

    前言 所有题目均来自力扣题库中的hot 100,之所以要记录在这里,只是方便后续复习 98.验证二叉搜索树 题目: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树. 有效 二叉搜 ...

  5. 代码随想录算法训练营第22天 二叉树 java :235. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

    文章目录 LeetCode 236. 二叉树的最近公共祖先 题目讲解 思路 LeetCode 701.二叉搜索树中的插入操作 题目讲解 思路 LeetCode 450.删除二叉搜索树中的节点 题目讲解 ...

  6. LeetCode二叉树系列——236.二叉树的最近公共祖先

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

  7. leetcode 236. 二叉树的最近公共祖先 递归解法 c语言

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

  8. 最近公共祖先_leetcode No.236 二叉树的最近公共祖先

    承接二叉搜索树的最近公共祖先. 题目链接: 二叉树的最近公共祖先 - 力扣(LeetCode)​leetcode-cn.com 题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百 ...

  9. 奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)...

    1. 二叉树最近公共祖先 奇安信集团 2020校招 服务端开发-应用开发方向在线考试 编程题|20分2/2 寻祖问宗 时间限制:C/C++语言 1000MS:其他语言 3000MS 内存限制:C/C+ ...

最新文章

  1. Ubuntu更新时遇到/boot空间不足
  2. ADF_ManagedBean的概念和管理(概念)
  3. java ssl证书生成_java – 使用jdk中提供的keytool生成SSL证书
  4. 图的存储 邻接矩阵+邻接表+链式前向星
  5. js获取a标签的value值_js逆向 | 某住房网跳转链接生成逻辑分析
  6. 乐高小颗粒履带机器人_乐高搭建+乐高编程…快带小朋友来漳州这家培训中心,边玩边学...
  7. JavaScript 中 Property 和 Attribute 的区别
  8. [当当网,你意欲何为]之二:无奈,配送之痛
  9. [转载] python字典更新值_Python–字典元组值更新
  10. 理解GetHashCode()的缺陷
  11. 交出20分钟后就得到面试通知的一份答卷
  12. 看大神如何玩转微信小程序日历插件?
  13. 如何满足python安装需求升级win7到SP1版本
  14. Clock saver for Mac(博朗手表时钟屏保)
  15. Python matplotlib绘制函数曲线
  16. ant安装配置问题:ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.
  17. GUI小工具-网盘搜索器
  18. I2C知识大全系列一 —— I2C相关概念
  19. 【ironic】ironic介绍与原理
  20. 使用jquery ajax调用后台方法 有时候不调用回调函数

热门文章

  1. 网页中插入优酷土豆视频并让它自适应的方法
  2. 苹果cmsV10自定义添加采集资源站教程
  3. Gerrit安装使用指导(一)
  4. 详细图解二叉树中序遍历(非递归C++)LeetCode94
  5. unity gradle
  6. 内蒙古农业大学计算机学院,内蒙古农业大学计算机与信息工程学院介绍
  7. 如何建设网站并与数据库相连(以access为例)
  8. C语言运算符优先级表
  9. 岐黄清痿汤治疗疾病方法
  10. Vim Ctags使用