题目链接
530. 二叉搜索树的最小绝对差
题目描述
解题思路
1.利用中序遍历把树转为有序数组,然后在数组上求两个相邻数字的最小值。
2.同样采用中序遍历,可以直接在递归遍历的过程中记录相邻数字的最小值。
3.因为题目给的树是二叉排序树,所以中序遍历的结果一定是一个有序数组,所以两个数的差的最小值一定出现在中序遍历中相邻的两个节点,所以可以借鉴链表记录前驱节点的方式记录中序遍历中的当前节点以及前驱节点,两者作差比较即可。
AC代码
解法一
class Solution {
LinkedList<Integer> ans = new LinkedList<>();
void InOrderTraversal(TreeNode root){
if(root != null){
InOrderTraversal(root.left);
ans.add(root.val);
InOrderTraversal(root.right);
}
}
public int getMinimumDifference(TreeNode root) {
InOrderTraversal(root);
int minn = 9999999;
for(int i = ans.size()-1;i > 0; i--){
if(ans.get(i)-ans.get(i-1) < minn) minn = ans.get(i)-ans.get(i-1);
}
return minn;
}
}
解法二
class Solution {
LinkedList<Integer> ans = new LinkedList<>();
int minn = 9999999;
int temp = 0;
void InOrderTraversal(TreeNode root){
if(root != null){
InOrderTraversal(root.left);
temp++;
ans.add(root.val);
if(temp>=2){
if(ans.get(temp-1)-ans.get(temp-2)<minn) minn = ans.get(temp-1)-ans.get(temp-2);
}
InOrderTraversal(root.right);
}
}
public int getMinimumDifference(TreeNode root) {
InOrderTraversal(root);
return minn;
}
}
解法三
class Solution {
private int minn = Integer.MAX_VALUE;
TreeNode pre = null;
void InOrderTravel(TreeNode root){
if(root == null) return;
InOrderTravel(root.left);
if(pre != null){
if(root.val - pre.val < minn) minn = root.val-pre.val;
}
pre = root;
InOrderTravel(root.right);
}
public int getMinimumDifference(TreeNode root) {
InOrderTravel(root);
return minn;
}
}