题目链接:530. 二叉搜索树的最小绝对差
题目描述
给你一个二叉搜索树的根节点 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
文章讲解:代码随想录
视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili
题解1:递归法
思路:中序遍历,遍历过程中找出最小差值。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var getMinimumDifference = function(root) {
let res = Number.MAX_VALUE;
let pre = null;
const inorder = function (node) {
node.left && inorder(node.left); // 左
// 中
if (pre && node.val - pre.val < res) {
res = node.val - pre.val;
}
pre = node;
node.right && inorder(node.right); // 右
}
inorder(root);
return res;
};
分析:时间复杂度为 O(n),空间复杂度为 O(logn)。
题解2:迭代法
思路:中序遍历的迭代法。
迭代法
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var getMinimumDifference = function(root) {
let res = Number.MAX_VALUE;
const stack = [];
let pre = null, cur = root;
while (stack.length > 0 || cur) {
if (cur) {
stack.push(cur);
cur = cur.left; // 左
} else {
cur = stack.pop();
// 中
if (pre && cur.val - pre.val < res) {
res = cur.val - pre.val;
}
pre = cur;
cur = cur.right; // 右
}
}
return res;
};
统一迭代法
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var getMinimumDifference = function(root) {
let res = Number.MAX_VALUE;
const stack = [];
let pre = null;
if (root) {
stack.push(root);
}
while (stack.length > 0) {
let node = stack.pop();
if (node) {
node.right && stack.push(node.right); // 右
stack.push(node, null); // 中
node.left && stack.push(node.left); // 左
} else {
node = stack.pop();
// 中
if (pre && node.val - pre.val < res) {
res = node.val - pre.val;
}
pre = node;
}
}
return res;
};
分析:时间复杂度为 O(n),空间复杂度为 O(logn)。
收获
利用二叉搜索树的特性优先考虑中序遍历。