数组最小差值问题
先排序,然后两两求差值。时间复杂度 O(N*logN)
二叉树最小差值问题
思路:使用TreeSet,将每个节点的数值放在set中,同时利用TreeSet的floor和ceiling方法,找到与当前元素最接近的key,然后更新全局的最小差值,遍历完所有节点,就一定可以找到最小差值(某一对节点)
static TreeSet<Integer> set = new TreeSet<>();
static int min = Integer.MAX_VALUE;
public static int getBinanryTreeMinimumDifference(TreeNode root) {
if (root == null) return min;
if (!set.isEmpty()) {
if (set.floor(root.val) != null) {
min = Math.min(min, root.val - set.floor(root.val));
}
if (set.ceiling(root.val) != null) {
min = Math.min(min, set.ceiling(root.val) - root.val);
}
}
set.add(root.val);
getBinanryTreeMinimumDifference(root.left);
getBinanryTreeMinimumDifference(root.right);
return min;
}
特别的,如果是二叉搜索树,答案可以简化,可以按照中序遍历,左根右刚好是升序,参考排序后数组最小差值的思路来解决
public class Solution {
int min = Integer.MAX_VALUE;
Integer prev = null;
public int getMinimumDifference(TreeNode root) {
if (root == null) return min;
getMinimumDifference(root.left);
if (prev != null) {
min = Math.min(min, root.val - prev);
}
prev = root.val;
getMinimumDifference(root.right);
return min;
}
}