JS Leetcode 530. 二叉搜索树的最小绝对差 题解分析,再次了解中序遍历
壹 ❀ 引
本题来自LeetCode 783. 二叉搜索树节点最小距离,题目描述如下:
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
示例 1:
输入:root = [4,2,6,1,3]
输出:1
示例 2:
输入:root = [1,0,48,null,null,12,49]
输出:1
提示:
树中节点数目在范围 [2, 100] 内
0 <= Node.val <= 105
差值是一个正数,其数值等于两值之差的绝对值
贰 ❀ 题解分析
也许当你看到此题,你会想着题目要求任意两个不同节点中找到最小差,应该怎么遍历才好呢。我们假定给你一个有序的数组[1,3,4,6],如果让你求最小差会怎么做?你一定会每次拿两个相邻的数进行求差,然后右移,一直找到最小的差集。
为什么是相邻的两个数?因为数组既然有序了,不找相邻难道求两个相隔N个数的差吗?比如上面的数组3-1的差一定比4-1的小。
所以暴力的做法,我们可以用递归的方式将二叉树转为数组,排序后依次遍历,并找出最小的差。虽然这样做可以,但其实没必要。
让我们再回头看一眼例子中的二叉树,你会发现每个左子树的节点,一定比父节点小,然后父节点又比右子树的节点小。
比如图1中,1<2<3,而3有可以看成是4的左子树,且2<4<5,哎?如果我们按照这个顺序去遍历,就不用生成数组还做排序了,因为这个过程就是有序的,那么这个查找过程其实就是中序遍历了。我在JS 前序遍历、中序遍历、后序遍历、层序遍历详解,深度优先与广度优先区别,附leetcode例题题解答案一文中介绍了前序遍历,中序遍历以及后续遍历的基本模板与遍历过程,有兴趣的同学可以看看。
那么我们直接贴上中序遍历的模板:
var inorderTraversal = function(root) {
// 遍历函数
function traversal(root) {
if (root !== null) {
if (root.left) {
// 递归遍历左子树
traversal(root.left);
};
// 访问根节点的值
console.log(root.val)
if (root.right) {
// 递归遍历右子树
traversal(root.right);
};
};
};
traversal(root);
};
因为中序遍历满足左节点------>根节点------>右节点的顺序,所以如果一个根节点有左节点,那就先访问左节点,而左节点可能还有自己的左节点,所以递归一直往下找,直到找不到了,这个时候我们就可以处理我们想要的逻辑了,比如打印出此时节点的值。
我们知道,函数调用栈是先进后出,当左节点的函数执行完成被释放,那自然下一个执行的就是自己的根节点的函数了,根节点函数执行完被释放,自然又会执行右节点的函数....一直执行,知道整个二叉树的节点被访问完毕。
那么我们就可以利用中序遍历的特点,在访问每个节点的时候,求跟上一个节点的差值,并存起来,然后依次比较,注意,我们要存2个东西,一个是上一个节点的值,这个值在递归时是不断被更新的,第二个是最小值,如果遇到更小就更新它即可。
综合上面的想法,让我们来实现它:
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var getMinimumDifference = function (root) {
function findMin(node) {
if (node === null) {
return;
};
if (node.left) {
findMin(node.left);
};
// 这里是为了避免第一个节点参与比较
if (pre !== null) {
// abs用于消除差为负数的情况,直接比较绝对值
min = Math.min(min, Math.abs(node.val - pre));
};
pre = node.val;
if (node.right) {
findMin(node.right);
};
};
// 第一个节点因为找不到更前面的节点了,所以故意设置个null用于消除第一次比较
let pre = null, min = Infinity;
findMin(root);
return min;
};
唯一需要注意的是是初始pre是null,目的是第一个左节点找不到其它节点进行求差,准确来说应该是从第二个节点开始才能求出差,所以设为null就是这个目的,其它就没什么难度了,那么本文结束。
JS Leetcode 530. 二叉搜索树的最小绝对差 题解分析,再次了解中序遍历的更多相关文章
- [LeetCode]230. 二叉搜索树中第K小的元素(BST)(中序遍历)、530. 二叉搜索树的最小绝对差(BST)(中序遍历)
题目230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 题解 中序遍历BST,得到有序序列,返回有序序列的k-1号元素. 代 ...
- 代码随想录算法训练营day21 | leetcode ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● ***236. 二叉树的最近公共祖先
LeetCode 530.二叉搜索树的最小绝对差 分析1.0 二叉搜索树,中序遍历形成一个升序数组,节点差最小值一定在中序遍历两个相邻节点产生 ✡✡✡ 即 双指针思想在树遍历中的应用 class So ...
- Java实现 LeetCode 530 二叉搜索树的最小绝对差(遍历树)
530. 二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 输入: 1 \ 3 / 2 输出: 1 解释: 最小绝对差为 1,其中 2 ...
- Leetcode:530. 二叉搜索树的最小绝对差
Leetcode:530. 二叉搜索树的最小绝对差 Leetcode:530. 二叉搜索树的最小绝对差 Talk is cheap . Show me the code . /** * Definit ...
- [LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差
Given a binary search tree with non-negative values, find the minimum absolute difference between va ...
- 530 Minimum Absolute Difference in BST 二叉搜索树的最小绝对差
给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值.示例 :输入: 1 \ 3 / 2输出:1解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...
- [LC]530题 二叉搜索树的最小绝对差
①题目 给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值. 示例 : 输入: 1 \ 3 / 2 输出:1 解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...
- [Swift]LeetCode530. 二叉搜索树的最小绝对差 | Minimum Absolute Difference in BST
Given a binary search tree with non-negative values, find the minimum absolute difference between va ...
- LeetCode530. 二叉搜索树的最小绝对差
题目 又是常见的BST,要利用BST的性质,即中序遍历是有序递增序列. 法一.中序遍历 1 class Solution { 2 public: 3 vector<int>res; 4 v ...
- [LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
随机推荐
- java - 标准类的定义
一个标准的类需要拥有下面 4个 组成部分: 1. 所有的成员变量都要使用 private 关键字进行修饰 2. 为每一个成员变量编写 set.get 方法 3. 创建一个无参数的构造方法 4. 创建一 ...
- Laravel - 使用查询构造器查询
public function constructorQuery() { # 1,新增 DB::table('student')->insert([ ...
- 如何看待《李跳跳》APP因被腾讯公司发律师函称“不正当竞争”而无限期停止更新?
一波未平一波又起,继李跳跳无限期停更后,又一安卓神奇工具被下发律师函!近期各路安卓工具APP,被某讯大厂可谓是尽数剿灭~ 不难看出此次行动是"蓄谋已久"了.与李跳跳.大圣净化类似的 ...
- pgcacher 的简单学习
pgcacher 的简单学习 学习地址 https://github.com/rfyiamcool/pgcacher https://zhuanlan.zhihu.com/p/551833981 ht ...
- MySQL调优学习-快速获取占用CPU较高的SQL语句
MySQL调优学习-快速获取占用CPU较高的SQL语句 背景 早上突然发现一个MySQL数据库的CPU使用率居高 因为是一个混布的环境上面还有一个redis 怕影响业务就上去像查看一下具体是何种原因导 ...
- Rsync的一个高级应用
Rsync的一个高级应用 背景 2019年刚开始接触linux时. 有一个很恶心的场景. 很多人为了简单起见, 提交数据库的修改(数据结果和预制数据) 都不是增量处理, 都是全量提交过来. 所以会造成 ...
- [转帖]Linux后门的几种姿势
转载自 https://evilanne.github.io/2017/08/26/Linux后门-持续关注/ 在一次渗透中,成功获取某目标几台比较重要的机器,当时只想着获取脱库,结果动静太大被发 ...
- 400G 光模块的价格
400G 光模块的价格 令人惊叹... https://www.fs.com/cn/c/40g-100g-transceivers-889?pro_type=&sortby=priced&a ...
- Springboot 数据库连接池大小简单总结
最近在进行性能压测, 想验证一下产品的极限性能, 在使用openpower 2路22核(SMT4)176线程 512G内存的服务器上面进行性能压测 压测进行到1000并发或者是2000并发时性能有一定 ...
- 如何通过gRPC传输文件
在gRPC中,可以通过将文件分割成多个小块,然后使用流式RPC将这些小块发送到服务器来传输文件.以下是一个简单的示例,展示了如何在gRPC中实现文件传输. 首先,我们需要定义一个服务来处理文件传输.在 ...

