二叉搜索树的最小绝对差[简单]

优质博文:IT-BLOG-CN

一、题目

给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入:root = [4,2,6,1,3]
输出:1

示例 2:

输入:root = [1,0,48,null,null,12,49]
输出:1

树中节点的数目范围是[2, 104]
0 <= Node.val <= 105

二、代码

考虑对升序数组a求任意两个元素之差的绝对值的最小值,答案一定为相邻两个元素之差的最小值,本题要求二叉搜索树任意两节点差的绝对值的最小值,而我们知道二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的,因此我们只要得到中序遍历后的值序列就可以在中序遍历的过程中用pre变量保存前驱节点的值,这样即能边遍历边更新答案,不再需要显式创建数组来保存,需要注意的是pre的初始值需要设置成任意负数标记开头,下文代码中设置为−1

java">/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int minVal;
    // 定义临时变量,存储相邻节点,因为val都是正整数,所以使用-1表示第一次存储
    int pre;
    public int getMinimumDifference(TreeNode root) {
        // 定义一个最小值,不断的迭代进行判断
        minVal = Integer.MAX_VALUE;
        pre = -1;
        dfs(root);
        return minVal;
    }

    private void dfs(TreeNode root) {
        // 递归退出条件
        if (root == null) {
            return;
        }
        // 中序遍历数据,先遍历左子树
        dfs(root.left);
        if (pre == -1) {
            pre = root.val;
        } else {
            // 因为是从小到大顺序遍历,所以无需绝对值
            minVal = Math.min(minVal, root.val - pre);
            pre = root.val;
        }
        dfs(root.right);
    }
}

时间复杂度: O(n)其中n为二叉搜索树节点的个数。每个节点在中序遍历中都会被访问一次且只会被访问一次,因此总时间复杂度为O(n)
空间复杂度: O(n)递归函数的空间复杂度取决于递归的栈深度,而栈深度在二叉搜索树为一条链的情况下会达到O(n)级别。


http://www.niftyadmin.cn/n/5136547.html

相关文章

C++ 递归调用的一些思考

关于递归调用&#xff0c;很多博客有讲&#xff0c;都说是进栈出栈的过程&#xff0c;但是很多人还是不能理解&#xff0c;为啥是进栈出栈的过程&#xff0c;其实说白了就是函数嵌套执行&#xff0c;内层执行完了&#xff0c;就执行外层。 这里举个一级递归的例子&#xff1a; …

第45天:标签的分类和重要属性及常用标签、css介绍及选择器

标签 标签的分类 按结构分&#xff0c;html标签可以分为单标签和双标签。 单标签 由一个标签组成。例如&#xff1a; <br/> <hr/> <img/> 双标签 由开始标签和结束标签两部分构成&#xff0c;例如&#xff1a; <a></a> <h></h> &l…

怎么看电脑有几个cpu?还有cpu是几核的?

一、怎么查看电脑有几个cpu 电脑CPU是电脑的核心&#xff0c;CPU是中央处理器&#xff0c;是电脑进行线程调度的关键&#xff0c;可以通过查看电脑CPU性能个数可以判定一个电脑的性能。今天小编介绍下如何查看电脑CPU个数。 简单的方式直接查看CPU个数。启动电脑后&#xff0c;…

flink 反压原理

背景 在flink中由于数据倾斜或者数据处理速率的不匹配&#xff0c;很容易引起反压&#xff0c;本文就看一下flink反压的原理 flink反压原理 flink全流程pineline的反压实现其实依赖于TaskManager之间的反压和TaskManager内部的反压来实现 1.TaskManager之间的反压 2.Task…

基于SpringBoot的社区医院管理系统设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 用户信息管理 病例信息管理 家庭医生管理 药品信息管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的…

2.10、自定义量化优化过程

introduction 如何自定义量化优化过程,以及如何手动调用优化过程 code from typing import Callable, Iterableimport torch import torchvision from ppq import QuantizationSettingFactory, TargetPlatform from ppq.api import (ENABLE_CUDA_KERNEL, QuantizationSetti…

stable-diffusion的模型简介和下载使用

前言 我们下载完stable-diffusion-ui后还需要下载需要的大模型&#xff0c;才能进行AI绘画的操作。秋叶的stable-diffusion-ui整合包内&#xff0c;包含了anything-v5-PrtRE.safetensors和Stable Diffusion-V1.5-final-prune_v1.0.ckpt两个模型。 anything-v5-PrtRE.safetenso…

MVCC面试题总结

MVCC解决的问题 ​   数据库并发场景有三种&#xff0c;分别为&#xff1a; ​   1、读读&#xff1a;不存在任何问题&#xff0c;也不需要并发控制 ​   2、读写&#xff1a;有线程安全问题&#xff0c;可能会造成事务隔离性问题&#xff0c;可能遇到脏读、幻读、不可…