L783二叉搜索树节点最小距离

  1. 二叉搜索树节点最小距离
    给定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值。

示例:

输入: root = [4,2,6,1,3,null,null]
输出: 1
解释:
注意,root是树节点对象(TreeNode object),而不是数组。

给定的树 [4,2,6,1,3,null,null] 可表示为下图:

      4
    /   \
  2      6
 / \    
1   3  

最小的差值是 1, 它是节点1和节点2的差值, 也是节点3和节点2的差值。

注意:

二叉树的大小范围在 2 到 100。
二叉树总是有效的,每个节点的值都是整数,且不重复。
本题与 530:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/ 相同

class Solution {
    int[] num;//不限定大小的数组只能使用ArrayList
    int i = 0;
    public int minDiffInBST(TreeNode root) {
        num = new int[200];
        dfs(root);
        Arrays.sort(num);
        //return num[1] - num[0];需要遍历一遍
        //同时排出0的可能性
        int ans = Integer.MAX_VALUE;
        for(int i = 0;  i < 200 - 1; i++){//错误原因在于for根本就不会进入,第一个条件就不满足
            if(num[i] == 0) continue;//这样写才能保证循环不会终止
            ans = Math.min(ans, num[i + 1] - num[i]);
        }
        return ans;
    }
    void dfs(TreeNode root){
        if(root == null) return;
        num[i++] = root.val;
        dfs(root.left);
        dfs(root.right);
    }
}

同样也可以换一个集合来考虑这样的问题,因为元素的个数不确定

class Solution {
   ArrayList<Integer> list;
    public int minDiffInBST(TreeNode root) {
        list = new ArrayList<>();
        dfs(root);
        Collections.sort(list);
        int len = list.size();
        int ans = Integer.MAX_VALUE;
        for(int i = 1; i < len; i++){
            ans = Math.min(ans, list.get(i) - list.get(i - 1));
        }
        return ans;

    }
    void dfs(TreeNode root){
        if(root == null) return;
        //num[i++] = root.val;
        list.add(root.val);
        dfs(root.left);
        dfs(root.right);
    }
}

3.这样空间复杂度比较大,同时还涉及了排序
可以利用中序遍历的方法,自然有序

class Solution {
    int ans;
    TreeNode pre;//用来保存前一个节点的地址
    public int minDiffInBST(TreeNode root) {
        pre = null;
        ans = Integer.MAX_VALUE;
        dfs(root);

        return ans;

    }
    void dfs(TreeNode root){
        if(root == null) return;
        dfs(root.left);
        if(pre != null) ans = Math.min(ans, root.val - pre.val);
        //首先不能是第一个节点,同时要进行更新pre
        pre = root;
        dfs(root.right);
    }
}

你可能感兴趣的:(LeetCode)