题目描述:
Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes.
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
思路一:
对BST中序遍历,得到的值是从小到大排序的,比较相邻两个值的差值即可。
时间复杂度O(N),空间复杂度O(1)。
class Solution {
int min = Integer.MAX_VALUE;
int pre = -1;
public int getMinimumDifference(TreeNode root) {
if (root == null)
return min;
getMinimumDifference(root.left);
if (pre != -1)
min = Math.min(min, root.val - pre);
pre = root.val;
getMinimumDifference(root.right);
return min;
}
}
若这棵树不是一棵BST,则将所有值加入到一个TreeSet中,每次用O(logN)的时间找出最近的值。
前序遍历,时间复杂度O(NlogN),空间复杂度O(N)。
对于TreeSet
floor(E e) 返回此集合中最大的元素小于或等于给定元素,如果没有这样的元素,则返回 null 。
ceiling(E e) 返回此集合中最小元素大于或等于给定元素,如果没有此元素,则返回 null 。
class Solution {
int min = Integer.MAX_VALUE;
TreeSet<Integer> set = new TreeSet<>();
public int getMinimumDifference(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);
getMinimumDifference(root.left);
getMinimumDifference(root.right);
return min;
}
}