前序遍历+排序. 时间复杂度: O(nlogn) 空间复杂度: O(n)

 1 class Solution {
 2     private int res=Integer.MAX_VALUE;
 3     private ArrayList<Integer> arry=new ArrayList<>();
 4     public int getMinimumDifference(TreeNode root){
 5         dfs(root); //前序遍历树的节点元素
 6         Collections.sort(arry); //排序
 7         for(int i=0;i<arry.size()-1;i++){ //最小绝对差肯定由大小相邻的两个元素产生
 8             int temp=Math.abs(arry.get(i+1)-arry.get(i));
 9             if(temp<res) res=temp;
10         }
11         return res;
12     }
13     void dfs(TreeNode root){
14         if(root==null) return;
15         arry.add(root.val);
16         dfs(root.left);
17         dfs(root.right);
18     }
19 }

 

没看到这是一棵二叉搜索树,中序遍历得到的就是从小到大排列的元素值,得出上一个元素和现有元素做差的绝对值,然后和上一个记录下的最小绝对差比较即可,时间复杂度: O(n),空间复杂度: O(1)

 1 class Solution {
 2     private int pre=Integer.MAX_VALUE; //设定初始值
 3     private int res=Integer.MAX_VALUE; //记录最小绝对差
 4     public int getMinimumDifference(TreeNode root){
 5         dfs(root);
 6         return res;
 7     }
 8     void dfs(TreeNode root){ //中序遍历
 9         if(root==null) return;
10         dfs(root.left);
11         res=Math.min(res,Math.abs(pre-root.val));
12         pre=root.val;
13         dfs(root.right);
14     }
15 }
posted on 2019-12-14 15:18  Chenjin123  阅读(333)  评论(0编辑  收藏  举报