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

【问题描述】[第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。

在这里插入图片描述

【解答思路】

1. 递归 后续遍历

由于是二叉搜索树,所以找最近的共同祖先比较容易,总共就三种情况。

  • 如果给定的两个节点的值都小于根节点的值,那么最近的共同祖先一定在左子树
  • 如果给定的两个节点的值都大于根节点的值,那么最近的共同祖先一定在右子树
  • 如果一个大于等于、一个小于等于根节点的值,那么当前根节点就是最近的共同祖先了
    至于前两种情况用递归继续去解决即可。

通过交换使得 p.val <= q.val ,这样就可以简化后边 if 语句的判断
时间复杂度:O(N) 空间复杂度:O(N)

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {// 保持 p.val <= q.valif (p.val > q.val) {return lowestCommonAncestor(root, q, p);}//如果有一个是根节点就可以提前结束, 当然这个 if 不要也可以if (p.val == root.val || q.val == root.val) {return root;}if (q.val < root.val) {return lowestCommonAncestor(root.left, p, q);} else if (p.val > root.val) {return lowestCommonAncestor(root.right, p, q);} else {return root;}}
2. 迭代

找到分割点就可以了。这个分割点就是能让节点 p和节点 q不能在同一颗子树上的那个节点,或者是节点 p 和节点 q中的一个,这种情况下其中一个节点是另一个节点的父亲节点

时间复杂度:O(N) 空间复杂度:O(1)

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {int pVal = p.val;int qVal = q.val;if (pVal == root.val || qVal == root.val) {return root;}// 保持 p.val <= q.valif (pVal > qVal) {int temp = pVal;pVal = qVal;qVal = temp;}while (true) {if (qVal < root.val) {root = root.left;} else if (pVal > root.val) {root = root.right;} else {return root;}}
}

【总结】

1.二叉搜索树定义
  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 任意节点的左、右子树也分别为二叉查找树;
  • 没有键值相等的节点。
2.二叉树遍历

前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点
中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点
后续遍历 先遍历输出左结点,再遍历输出右结点,最后输出当前结点的数据

3. 中序遍历输出的是一个升序数组
4. 对于二叉树的题,开始可以用递归的思想去思考会比较简单

相关题目 236

转载链接:https://leetcode.wang/leetcode-235-Lowest-Common-Ancestor-of-a-Binary-Search-Tree.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天猫服务系统的架构和经验

主要内容 业务介绍 分析设计过程 过程推演 事件/流程架构及使用场景讨论 基础组件介绍 改进点 业务介绍 业务介绍-业务关键点 产品定位 买家&#xff1a;提供标准的、优质的服务体验卖家&#xff1a;整合各环节资源&#xff0c;提供便捷的产品&#xff1b;提升服务质量、降低…

[Leedcode][JAVA][第50题][Pow(x, n)][快速幂][分治][转换类型]

【问题描述】[第50题][Pow(x, n)][中等] 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数。输入: 2.10000, 3 输出: 9.26100 示例 3:输入: 2.00000, -2 输出: 0.25000 解释: 2-2 1/22 1/4 0.25【解答思路】 1.快速幂 时间复杂度&#xff1a;O(logN) 空间复杂度&#x…

淘宝网商品管理?技术 ?

目录 技术挑战 商品管理 系统的演化过程 技术细节 展望 技术挑战淘宝商品管理 十亿级商品数百万级用户数每天处理TB级数据数据沉淀成本控制业务多变上千条业务规则 发展过程淘宝商品管理 第一阶段&#xff1a;基于搜索 基于搜索的商品管理 〙实现 存储用户设置的规则&…

考计算机网络证书转深户,惊?这个证书能帮你直接入深户,还没有学历要求? 你还在等什么...

原标题&#xff1a;惊&#xff1f;这个证书能帮你直接入深户&#xff0c;还没有学历要求&#xff1f; 你还在等什么只要持有中级职称&#xff0c;40周岁以内申请入户时&#xff0c;有连续半年以上社保&#xff0c;就可以直接入户了&#xff0c;没有学历的要求&#xff01;而之前…

[Leedcode][JAVA][第155题][最小栈][基本类型包装类]

【问题描述】 【解答思路】 1. 两个栈实现 1.1、辅助栈和数据栈同步 特点&#xff1a;编码简单&#xff0c;不用考虑一些边界情况&#xff0c;就有一点不好&#xff1a;辅助栈可能会存一些“不必要”的元素。 1.2、辅助栈和数据栈不同步 特点&#xff1a;由“辅助栈和数据…

淘宝主站Cgroup资源控制

目录 项目背景&#xff1a;主站的现状 选型的过程 Cgroup/LinuxContainer介绍 定制和开发 存在的问题和对策 项目背景 主站&#xff1a; 跑在xen虚拟机上的Java应用 处理业务逻辑&#xff0c;本地无重要存储&#xff0c;无状态。 一台物理机部署3台虚拟机 双路Xeon&#…

[Leedcode][JAVA][第102题][二叉树的层序遍历][递归][迭代][BFS]

【问题描述】[第102题][二叉树的层序遍历][中等] 给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。示例&#xff1a; 二叉树&#xff1a;[3,9,20,null,null,15,7],3/ \9 20/ \15 7 返…

java学习(178):终篇?静态代理?动态代理?

总体设计 包com.xzit.aop DynlnvokeProducerProxy 包com.xzit.db db 包com.xzit.entity ClientDepartmentEmployeeGoodsProducer 包com.xzit.interfaces DepartmentDaoImpEmployeeDaoImpIGoodsIObject 包com.xzit.proxy TeatDynProxyTestStaticProxy 咱直接上代码&#xff0c;…

[Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

【问题描述】[] 前序遍历 先输出当前结点的数据&#xff0c;再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点&#xff0c;再输出当前结点的数据&#xff0c;再遍历输出右结点 后续遍历 先遍历输出左结点&#xff0c;再遍历输出右结点&#xff0c;最后输出当前结点的数…

sqlserver:(2):window下SQL server数据库数据源的配置

1首先打开控制面板 2选择64位数据源 3添加 4选择sql server 做好配置&#xff0c;下一步 下一步 下一步 测试

聚类算法:K-Means

1.K-Means定义&#xff1a; K-Means是一种无监督的基于距离的聚类算法&#xff0c;简单来说&#xff0c;就是将无标签的样本划分为k个簇&#xff08;or类&#xff09;。它以样本间的距离作为相似性的度量指标&#xff0c;常用的距离有曼哈顿距离、欧几里得距离和闵可夫斯基距离…

html:(1) 登录界面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- content属性值 :width:可视区域的宽度&#xff0c;值可为数字或关键词device-widthheight:同widthintial-scale:页面首次被显示是可视区域的缩放级别&#x…

[Leedcode][JAVA][第5题][最长回文子串][数组][动态规划]

【问题描述】[第5题][最长回文子串][中等] 给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1&#xff1a;输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。【解答思路】 1. 中心扩展法…

一流大学计算机专业,计算机专业一流大学太难考,不妨退而求其次,看看这5所大学...

原标题&#xff1a;计算机专业一流大学太难考&#xff0c;不妨退而求其次&#xff0c;看看这5所大学因为就业率高、薪酬待遇好&#xff0c;又是前沿科技&#xff0c;所以计算机专业近一二十年来一直都很热门&#xff0c;开设计算机专业的院校也如雨后春笋一般冒了出来&#xff…

[Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]

【问题描述】[第560题][和为K的子数组][中等] 给定一个整数数组和一个整数 k&#xff0c;你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums [1,1,1], k 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 :数组的长度为 [1, 20,000]。 数组中元素的范围…

html表格复制最后一行字,为什么Word中的表格输入文字最后一行文字会自动跳到下一页...

为什么Word中的表格输入文字最后一行文字会自动跳到下一页以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;为什么Word中的表格输入文字最后一行文字会自动跳到下一页, 在WPS文字中的表格中打…

购物车的基本流程

一、购物车的需求描述和基本流程1、需求描述1、 用户可以在登录状态下将商品添加到购物车 2、 用户可以在未登录状态下将商品添加到购物车 3、 用户可以使用购物车一起结算下单 4、 用户可以查询自己的购物车 5、 用户可以在购物车中可以修改购买商品的数量。 6、 用户可以在购…

canvas填充规则

canvas填充规则 const canvas document.getElementById(canvas); const ctx canvas.getContext(2d);ctx.beginPath(); ctx.fillStylegreen ctx.arc(50, 50, 30, 0, Math.PI * 2, true); ctx.arc(50, 50, 20, 0, Math.PI * 2, true); ctx.arc(50, 50, 15, 0, Math.PI * 2, tr…

1.web技术的前世今生

目录 1web Web服务器 Web页面 Web的作用 所谓Web 2web技术 分类主流 Web技术 工作原理 Web服务器 •1990年&#xff0c;第一个Web服务器开始 运行 •网站服务器 •站点服务器 •本质上是一个软件系统 •安装了web服务器软件的计算机 为什么没有流传 •操作太复杂…

计算机科学中的研究成果,田聪教授团队科研成果在计算机科学顶会LICS 2020发表...

(通讯员 王文胜)第35届ACM/IEEE计算机科学逻辑国际会议(ACM/IEEE Symposium on Logic in Computer Science,http://lics.siglog.org/lics20/)&#xff0c;简称LICS 2020&#xff0c;于7月08日—7月11日在线举行(主会场设在德国萨尔布吕肯)。该会议是理论计算机科学领域最顶级的…