[LeetCode]530. 二叉搜索树的最小绝对差(java实现)
1. 题目
2. 读题(需要重点注意的东西)
- 通常二叉搜索树的问题,都要利用好它本身的性质—即左小右大;
- 要掌握如何在二叉树中记录前一个节点。
3. 解法
解法1:最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int min = Integer.MAX_VALUE;
List<Integer> nums = new ArrayList<Integer>();
public int getMinimumDifference(TreeNode root) {
if(root == null) return -1;
nums = helper(root);
for(int i = 0; i < nums.size();i++){
for(int j = i+1 ; j < nums.size(); j++){
if(nums.get(j)-nums.get(i)<min) min = nums.get(j)-nums.get(i);
}
}
return min;
}
public List<Integer> helper(TreeNode root){
if(root == null) return new ArrayList<>();
helper(root.left);
nums.add(root.val);
helper(root.right);
return nums;
}
}
解法2:递归,利用二叉搜索树的有序性质,在第一次遍历树的时候就计算相邻节点之差以及最小值。(双指针,定义一个preNode来记录前一个节点)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int min = Integer.MAX_VALUE;
private TreeNode preNode = null;
public int getMinimumDifference(TreeNode root) {
if(root == null) return -1;
getMinimumDifference(root.left);
if(preNode != null) min = Math.min(min,root.val - preNode.val);
preNode = root;
getMinimumDifference(root.right);
return min;
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 递归法
- 双指针
6. 总结
要掌握如何在二叉树中记录前一个节点。
getMinimumDifference(root.left);
if(preNode != null) min = Math.min(min,root.val - preNode.val);
// 记录前一个节点
preNode = root;
getMinimumDifference(root.right);