530. 二叉搜索树的最小绝对差(深搜)

前序遍历+排序. 时间复杂度: 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 }
原文地址:https://www.cnblogs.com/NiBosS/p/12039615.html