由于在中序遍历下的BST得到的值依然是依次有序的,利用这一点,保存前一个点和现有点进行比较就好了,时间是O(N)。
证明如下:对于一个BST,左侧是比他小的数,右侧是比他大的数,采取中序遍历时,当我们遍历左半部分时,可以递归的发现,最左边的结点是最先访问的,最右边的结点是最后访问的。当我们回到root时,前一个访问的结点是左半部分的最右结点,如果摊平数组,可以得到这两个数肯定是相邻的,于是问题就变成了顺序遍历有序数组得到最小差。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
TreeNode pre = null;
int min = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
getDifference(root);
return min;
}
private void getDifference(TreeNode root)
{
if(root==null)return ;
getDifference(root.left);
if(pre!=null)
{
min=Math.min(min,Math.abs(pre.val-root.val));
}
pre=root;
getDifference(root.right);
}
}