二叉搜索树题目:二叉搜索树的最小绝对差

2024-02-12 22:12

本文主要是介绍二叉搜索树题目:二叉搜索树的最小绝对差,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:二叉搜索树的最小绝对差

出处:530. 二叉搜索树的最小绝对差

难度

3 级

题目描述

要求

给定一个二叉搜索树的根结点 root \texttt{root} root,返回树中任意两个不同结点值之间的差值绝对值的最小值。

示例

示例 1:

示例 1

输入: root = [4,2,6,1,3] \texttt{root = [4,2,6,1,3]} root = [4,2,6,1,3]
输出: 1 \texttt{1} 1

示例 2:

示例 2

输入: root = [1,0,48,null,null,12,49] \texttt{root = [1,0,48,null,null,12,49]} root = [1,0,48,null,null,12,49]
输出: 1 \texttt{1} 1

数据范围

  • 树中结点数目在范围 [2, 10 4 ] \texttt{[2, 10}^\texttt{4}\texttt{]} [2, 104]
  • 0 ≤ Node.val ≤ 10 5 \texttt{0} \le \texttt{Node.val} \le \texttt{10}^\texttt{5} 0Node.val105

解法一

思路和算法

由于二叉搜索树的中序遍历序列是单调递增的,因此只要得到二叉搜索树的中序遍历序列,然后计算序列中的每一对相邻结点值之差的绝对值,其中的最小值即为任意两个不同结点值之间的差值绝对值的最小值。

由于只是计算二叉搜索树的中序遍历序列中的每一对相邻结点值之差的绝对值,因此不需要存储完整的中序遍历序列,而是只需要存储上一个遍历到的结点值。每次访问结点时,当前结点值一定大于上一个结点值,因此计算当前结点值与上一个结点值之差,即为相邻结点值之差的绝对值。遍历结束之后,即可得到任意两个不同结点值之差的绝对值的最小值。

代码

class Solution {public int getMinimumDifference(TreeNode root) {int minDiff = Integer.MAX_VALUE;Deque<TreeNode> stack = new ArrayDeque<TreeNode>();int prev = Integer.MIN_VALUE / 10;TreeNode node = root;while (!stack.isEmpty() || node != null) {while (node != null) {stack.push(node);node = node.left;}node = stack.pop();minDiff = Math.min(minDiff, node.val - prev);prev = node.val;node = node.right;}return minDiff;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。空间复杂度主要是栈空间,取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)

解法二

思路和算法

解法一虽然不需要存储中序遍历序列,但是仍需要使用栈空间。使用莫里斯遍历可以将空间复杂度降低到 O ( 1 ) O(1) O(1)

遍历过程中维护上一个结点值。每次访问结点时,计算当前结点值与上一个结点值之差。遍历结束之后,即可得到任意两个不同结点值之差的绝对值的最小值。

代码

class Solution {public int getMinimumDifference(TreeNode root) {int minDiff = Integer.MAX_VALUE;int prev = Integer.MIN_VALUE / 10;TreeNode node = root;while (node != null) {if (node.left == null) {minDiff = Math.min(minDiff, node.val - prev);prev = node.val;node = node.right;} else {TreeNode predecessor = node.left;while (predecessor.right != null && predecessor.right != node) {predecessor = predecessor.right;}if (predecessor.right == null) {predecessor.right = node;node = node.left;} else {predecessor.right = null;minDiff = Math.min(minDiff, node.val - prev);prev = node.val;node = node.right;}}}return minDiff;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。使用莫里斯遍历,每个结点最多被访问两次。

  • 空间复杂度: O ( 1 ) O(1) O(1)

这篇关于二叉搜索树题目:二叉搜索树的最小绝对差的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703731

相关文章

LeetCode--155 最小栈

题目 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) -- 将元素 x 推入栈中。pop() -- 删除栈顶的元素。top() -- 获取栈顶元素。getMin() -- 检索栈中的最小元素。 示例 MinStack minStack = new MinStack();minStack.push(-2);minStack.push

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

【计算机组成原理】部分题目汇总

计算机组成原理 部分题目汇总 一. 简答题 RISC和CICS 简要说明,比较异同 RISC(精简指令集)注重简单快速的指令执行,使用少量通用寄存器,固定长度指令,优化硬件性能,依赖软件(如编译器)来提升效率。 CISC(复杂指令集)包含多样复杂的指令,能一条指令完成多步操作,采用变长指令,减少指令数但可能增加执行时间,倾向于硬件直接支持复杂功能减轻软件负担。 两者均追求高性能,但RISC

算法11—判断一个树是不是二叉查询树

问题: 给定一个二叉树,判断它是否是二叉查询树。 思路: 要判断是否是二叉查询树,标准就是看每一个节点是否满足:1、左节点及以下节点的值比它小;2、右节点及以下节点的值比它大。当然,前提是子节点都存在的情况。所以,我们需要从根节点不断向下递归,只要所有节点都满足,那么就是BST,否则,就不是。 代码: [java]  view plain copy pri

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

Ural 1277 cops ans thieves (最小割模型)

题目地址 :http://acm.timus.ru/problem.aspx?space=1&num=1277 这里我们要拆点。把一个点拆成i,i' 。如何 i,j有边 ,在建边(i,j',inf),(j,i',inf)。 然后每个点点边(i',i,R[i])。这样建边以后,若要阻止 s到f的路径,那么必须破败一些边,那么我们为了是的边权最小,必须破坏边权小于inf的边,对应的就是图中拆

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

【智能优化算法改进策略之局部搜索算子(五)—自适应Rosenbrock坐标轮换法】

1、原理介绍 作为一种有效的直接搜索技术,Rosenbrock坐标轮换法[1,2]是根据Rosenbrock著名的“香蕉函数”的特点量身定制的,该函数的最小值位于曲线狭窄的山谷中。此外,该方法是一种典型的基于自适应搜索方向集的无导数局部搜索技术。此法于1960年由Rosenbrock提出,它与Hooke-Jeeves模式搜索法有些类似,但比模式搜索更为有效。每次迭代运算分为两部分[3]: 1)

Day59 代码随想录打卡|二叉树篇---把二叉搜索树转换为累加树

题目(leecode T538): 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。 方法:本题