Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes.
Example:
Input:
1
\
3
/
2
Output:
1
Explanation:
The minimum absolute difference is 1, which is the difference between 2 and 1 (or between 2 and 3).
找出二叉搜索树中两两节点间差的绝对值的最小值
思路:
二叉搜索树有个特点就是它的中序遍历值是升序的
相当于一个升序数组,两个值的最小差只能在相邻元素中产生
因为升序数组[a, b, c], 那么a < b < c, 那么c - a > b - a
可以中序遍历BST,把遍历过的节点值保存在数组中,然后数组依次两两元素求差取最小
public int getMinimumDifference(TreeNode root) {
List<Integer> nodes = new ArrayList<>();
int diff = 0;
midTraversal(root, nodes);
diff = nodes.get(1) - nodes.get(0);
for(int i = 2; i < nodes.size(); i++) {
diff = Math.min(diff, nodes.get(i) - nodes.get(i-1));
}
return diff;
}
public void midTraversal(TreeNode root, List<Integer> nodes) {
if(root == null) return;
midTraversal(root.left, nodes);
nodes.add(root.val);
midTraversal(root.right, nodes);
}
因为求差时只需要用到前一个值,因此可以每次访问到root时保存前一个的值,下次再求差的绝对值取最小
因为BST中值都是非负,所以pre的初始值可以取-1
class Solution {
int pre = -1;
int diff = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
midTraversal(root);
return diff;
}
public void midTraversal(TreeNode root) {
if(root == null) return;
midTraversal(root.left);
if(pre != -1) {
diff = Math.min(diff, Math.abs(root.val - pre));
}
pre = root.val;
midTraversal(root.right);
}
}