# 二叉搜索树节点最小距离(783)
# 题目
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
注意:本题与 530.二叉搜索树的最小绝对差 (opens new window) 相同
# 示例
输入:root = [4,2,6,1,3]
输出:1
输入:root = [1,0,48,null,null,12,49]
输出:1
# 提示
- 树中节点数目在范围 [2, 100] 内
- 0 <= Node.val <= 105
# 算法
# 排序
先遍历出树中所有值,保存在数组values
中,然后由小至大地排序数组values
,然后相邻数字两两求差,使用min
保存这些差值中的最小值,最后结果返回min
const minDiffInBST = root => {
let values = [];
function BST(node) {
if (node) {
values.push(node.val);
if (node.left) BST(node.left);
if (node.right) BST(node.right);
}
}
BST(root);
let min = Infinity;
values.sort((a, b) => a - b);
for (let i = 1; i < values.length; i++) {
min = Math.min(min, values[i] - values[i - 1]);
}
return min;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 中序遍历
因为二叉搜索树中序遍历得到的值序列是递增有序的,所以我们使用中序遍历遍历这个二叉搜索树,用变量pre
保存当前节点node
的前序节点,在遍历的同时求差,使用变量min
保存这个过程中的最小值,最后结果返回min
const minDiffInBST = root => {
let min = Infinity,
pre = -1;
function BST(node) {
if (!node) return;
BST(node.left);
if (pre !== -1) min = Math.min(min, node.val - pre);
pre = node.val;
BST(node.right);
}
BST(root);
return min;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13