Leetcode 剑指 Offer II 053. 二叉搜索树中的中序后继

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。

节点 p 的后继是值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。

示例 1:

  • 输入:root = [2,1,3], p = 1
  • 输出:2
  • 解释:这里 1 的中序后继是 2。请注意 p 和返回值都应是 TreeNode 类型。

示例 2:

  • 输入:root = [5,3,6,2,4,null,null,1], p = 6
  • 输出:null
  • 解释:因为给出的节点没有中序后继,所以答案就返回 null 了。

提示:

  • 树中节点的数目在范围 [1, 10^4] 内。
  • -10^5 <= Node.val <= 10^5
  • 树中各节点的值均保证唯一。

题目思考

  1. 如何尽可能降低时间和空间复杂度?
  2. 如何利用二叉搜索树的性质?

解决方案

思路
  • 根据题目描述, 一个很容易想到的思路就是中序遍历, 同时存储当前遍历到的节点的前一节点 pre, 这样当 pre 是 p 时, 也就意味着当前节点就是 p 的中序后继, 将它保存为最终结果并返回即可
  • 不过这样我们就得从头开始遍历所有节点, 而且会有递归栈的额外空间消耗, 另外还没有用到二叉搜索树这个条件, 有没有更好的方法呢?
  • 回顾二叉搜索树的性质, 其中序遍历的节点是有序的, 那么某个节点的中序后继, 一定是对应有序数组右侧紧挨着它的元素, 也即大于 p 的最小节点
  • 我们可以利用这一特点, 采用二分查找, 具体过程如下:
    • 从根节点开始, 如果当前节点大于 p 节点时, 向左子树方向继续查找, 否则就向右子树方向查找
    • 在查找的同时, 维护一个变量 res 保存最终结果, 并初始化为空
    • 如果当前节点大于 p 节点, 且 res 为空或者 res 小于当前节点, 就更新 res 为当前节点
  • 这样最终二分查找结束时, res 对应的节点就是 p 的中序后继
  • 下面代码中包含了上述两种做法, 并有详细的注释, 方便大家理解
复杂度
  • 中序遍历
    • 时间复杂度 O(N): 从头开始遍历每个节点, O(N)
    • 空间复杂度 O(H): 递归调用最多使用 O(H) 栈空间, H 是树的高度
  • 二分查找
    • 时间复杂度 O(logN): 每次二分都只需要朝某个方向继续查找, 所以是 O(logN)
    • 空间复杂度 O(1): 只使用了几个常数空间的变量
代码
class Solution:def inorderSuccessor(self, root: "TreeNode", p: "TreeNode") -> "TreeNode":# 方法1: 中序遍历res = Nonepre = Nonedef inorder(cur):nonlocal res, preif not cur:returninorder(cur.left)if pre == p:# pre是p, 自然cur就是p的中序后继res = cur# 更新pre为当前节点, 用于下个节点的判断pre = curinorder(cur.right)inorder(root)return res# 方法2: 二分查找cur = rootres = Nonewhile cur:if cur.val > p.val:if res is None or cur.val < res.val:# 当前节点是第一个大于p的, 或者它小于res, 更新它为最终结果res = cur# 向右子树方向继续查找cur = cur.leftelse:# 向左子树方向继续查找cur = cur.rightreturn res

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

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

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

相关文章

适用于 Windows 的 10 款最佳数据恢复工具

在数字时代&#xff0c;数据就是一切。 从珍贵的家庭照片和重要的工作文件到我们最喜欢的音乐和电影&#xff0c;我们的生活存储在越来越多的不同设备上。 系统崩溃、意外删除或恶意病毒都可能导致有价值的数据在瞬间丢失。 这就是数据恢复工具的用武之地。 适用于 Windows 的 …

基于社会群体算法优化概率神经网络PNN的分类预测 - 附代码

基于社会群体算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于社会群体算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于社会群体优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

linux:删除乱码文件、目录

由于编码原因&#xff0c;在linux服务器上上传、创建中文文件或目录时&#xff0c;会产生乱码&#xff0c;如果想删除它&#xff0c;发现用rm命令是删除不了的&#xff0c;这种情况下&#xff0c;用find命令可以删除乱码的文件或目录。 首先进入乱码文件或目录所在的目录&…

5G与中国的海

今年国庆假期&#xff0c;香港迎来了阔别5年的国庆维港烟花汇演 10月1日晚上9点&#xff0c;“HKT x FWD 2023 年国庆烟花汇演”在维多利亚港上空上演。在23分钟时间里&#xff0c;燃放了超过3万枚烟花。而与以往维港烟花秀不同的是&#xff0c;为了让更多民众欣赏这次表演&…

uview使用u-action-sheet添加滚动条

0 效果 1 修改uview源码 node_modules/uview-ui/u-action-sheet/u-action-sheet.vue

Python字典六种类型概述

1. 引言 看到这个标题&#xff0c;你可能会觉得奇怪&#xff0c;事实上在Python的标准库中共有6种字典类型&#xff01;在某些情形下&#xff0c;你可能会觉得标准的Python字典dict&#xff0c;并不能完全符合你的需求。在本文中&#xff0c;我们将讨论Python中其他5个鲜为人知…

STM32与ZigBee无线通信技术在工业自动化中的应用

工业自动化是指利用电子技术、计算机技术和通信技术等手段&#xff0c;对工厂、设备和生产过程进行自动化控制和管理的过程。在工业自动化中&#xff0c;可靠的无线通信技术对于实时数据的传输和设备的协同控制至关重要。本文将介绍STM32微控制器与ZigBee无线通信技术在工业自动…

电子学会C/C++编程等级考试2021年06月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。输出 一行两个数,分…

monaco-editor 简单使用

一. 文件调用示例 1. 安装package包 官方文档 "monaco-editor": "^0.28.1", "monaco-editor-webpack-plugin": "^4.2.0", Copy 请注意安装包的版本号 monaco-editor-webpack-pluginmonaco-editor7.*.*> 0.31.06.*.*0.30.*5.*.*…

【Linux网络】从原理到实操,感受PXE无人值守自动化高效批量网络安装系统

一、PXE网络批量装机的介绍 1、常见的三种系统安装方式 2、回顾系统安装的过程&#xff0c;了解系统安装的必要条件 3、什么是pxe 4、搭建pxe的原理 5、Linux的光盘镜像中的isolinux中的相关文件学习 二、关于实现PXE无人值守装机的四大文件与五个软件的对应关系详解 5个…

Struts2 数据校验之四兄弟

现在是科技的时代&#xff0c;大多数人都在网上购物了&#xff0c; 我们都碰到过相同的问题&#xff0c;各大网站弄的那些各种各样的注册页面&#xff0c;相信大家都深有体会。 有了这验证就很好的保证了我们的信息的准确性和安全性。 接下来我给大家讲解一下用struts2怎么实…

CVE-2021-42287CVE-2021-42278 域内提权

倘见玉皇先跪奏&#xff1a;他生永不落红尘 本文首发于先知社区&#xff0c;原创作者即是本人 前言 网络安全技术学习&#xff0c;承认⾃⼰的弱点不是丑事。只有对原理了然于⼼&#xff0c;才能突破更多的限制。拥有快速学习能力的白帽子&#xff0c;是不能有短板的&#xf…