783. Minimum Distance Between BST Nodes
题目描述和难度
- 题目描述:
给定一个二叉搜索树的根结点 root
, 返回树中任意两节点的差的最小值。
示例:
输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: 注意,root是树结点对象(TreeNode object),而不是数组。 给定的树 [4,2,6,1,3,null,null] 可表示为下图: 4 / \ 2 6 / \ 1 3 最小的差值是 1, 它是节点1和节点2的差值, 也是节点3和节点2的差值。
注意:
- 二叉树的大小范围在
2
到100
。 - 二叉树总是有效的,每个节点的值都是整数,且不重复。
- 题目难度:简单。
- 英文网址:783. Minimum Distance Between BST Nodes 。
- 中文网址:783. 二叉搜索树结点最小距离 。
思路分析
求解关键:最容易想到的就是得到中序遍历数组,然后得到最小距离。不过我们也可以在中序遍历的时候,就进行比较得到最小距离,这样空间复杂度就可以降至常数级别。
参考解答
参考解答1
import java.util.ArrayList;
import java.util.List;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
// 我起初的思路是使用中续遍历,返回最小值
public int minDiffInBST(TreeNode root) {
List<Integer> inOrderList = new ArrayList<>();
inOrder(root, inOrderList);
int len = inOrderList.size();
int ret = Integer.MAX_VALUE;
for (int i = 0; i < len - 1; i++) {
ret = Math.min(ret, inOrderList.get(i + 1) - inOrderList.get(i));
}
return ret;
}
private void inOrder(TreeNode node, List<Integer> inOrderList) {
if (node == null) {
return;
}
inOrder(node.left, inOrderList);
inOrderList.add(node.val);
inOrder(node.right, inOrderList);
}
}
参考解答2
public class Solution2 {
public int minDiffInBST(TreeNode root) {
// 设置为 Integer 是为了检测出没有赋值的情况
Integer[] preVal = new Integer[1];
int[] ret = new int[]{Integer.MAX_VALUE};
inOrder(root,preVal,ret);
return ret[0];
}
private void inOrder(TreeNode node, Integer[] preVal, int[] ret) {
if (node == null) {
return;
}
inOrder(node.left, preVal, ret);
if (preVal[0] != null) {
int diff = node.val - preVal[0];
ret[0] = Math.min(ret[0], diff);
}
// 注意,在这个位置更新之前的值
preVal[0] = node.val;
inOrder(node.right, preVal, ret);
}
}
本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0783-minimum-distance-between-bst-nodes ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com 。