LeetCode------783
心得分享:
这一题重在理解 搜索二叉树--------有序这个特点---->要么存入任意遍历存储数组中后再排序,
或者中序遍历,由搜索二叉树的天然结构我们可以知道中序遍历天然有序,是从小到大排序的。
那么这一题就十分简单了。
这是一种较理解但并不简洁的写法
class Solution {
int differ = Integer.MAX_VALUE;
ArrayList<Integer> number = new ArrayList<>();
public int minDiffInBST(TreeNode root) {
mid(root);
min(number);
return differ;
}
public void mid(TreeNode node){
if(node == null){
return ;
}
mid(node.left);
number.add(node.val);
mid(node.right);
}
public void min(ArrayList<Integer> number){
for(int i = 0 ; i < number.size()-1 ; i++){
if(differ > Math.max(number.get(i) - number.get(i+1),number.get(i+1) - number.get(i))){
differ = Math.max(number.get(i) - number.get(i+1),number.get(i+1) - number.get(i));
}
}
}
}
我们试想能否在中序遍历的过程中就计算前后结点的差值呢?
显然是可以的,思路是这样的:
我们只要能保存当前递归层次的上一层递归的结点node.val即可以这么操作
那不是很简单吗~~~~
class Solution {
int differ = Integer.MAX_VALUE;
int pre = -1;
public int minDiffInBST(TreeNode root) {
mid(root);
return differ;
}
public void mid(TreeNode node){
if(node == null) return ;
mid(node.left);
if(pre != -1){
differ = Math.min(differ,Math.max(pre - node.val , node.val - pre));
}
pre = node.val;
mid(node.right);
}
}