
思路1:中序遍历,递归排序成有序数组;因为是有序,只需要求相邻两个值的最小差值。
class Solution {
    ArrayList <Integer> list = new ArrayList();
    int ans = 100001;//题目最大 100000
    public int getMinimumDifference(TreeNode root) {
        getMinimumDifference1(root);
        //遍历计算排序好的两个最小绝对值。
        for(int i=list.size()-1;i>0;i--) {
           ans = Math.min(ans, list.get(i) - list.get(i-1));
        }
        return ans;
    }
//中序遍历,递归排序成有序数组
    public void getMinimumDifference1(TreeNode root) {
        if(root == null) return;
        getMinimumDifference1(root.left);
        list.add(root.val);
        getMinimumDifference1(root.right);
    }
    
}
思路2:双指针法:中序遍历是有序的,在遍历的时候顺便相减,可以像有序数组的特性一样,一直相减,记录两个差值的最小绝对值。能少开一个数组的空间
class Solution {
    int ans = 100001;
    TreeNode preNode = null; //前一个节点
    public int getMinimumDifference(TreeNode root) {
        getMinimumDifference1(root);
        return ans;
    }
    //curNode 当前节点
    public void getMinimumDifference1(TreeNode curNode) {
        if(curNode == null) return;
        //左
        getMinimumDifference1(curNode.left);
        
        //中
        if(preNode != null) {
            ans = Math.min(ans, curNode.val - preNode.val);
        }
        //让preNode  一直跟在 curNode 后一个身位
        preNode = curNode;
        
        //右
        getMinimumDifference1(curNode.right);
    }
    
}



















