530. 二叉搜索树的最小绝对差
知识点:二叉搜索树中序遍历的时候是一个有序序列
暴力法:把二叉树转变为一个有序数组
技巧:①中序遍历,因为中序遍历的时候二叉搜索树是有序的 ②双指针,当前遍历的节点cur,减去上一个遍历的节点pre的数值,并且通过全局变量保存最大值。那么怎么获得中序遍历时上一个节点pre的数值?
首先pre一定是全局变量
中序遍历的递归写法:进入到inorder函数时,root就是当前节点,
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
inorder(root, res);
return res;
}
void inorder(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
//左
inorder(root.left, list);
//中
list.add(root.val); // 注意这一句
//右
inorder(root.right, list);
}
}
本题解答
关键点在中序遍历的时候,每个节点的访问次数是两次,第一次不处理(要等访问完左子树之后才处理),第二次处理时,其左子树的节点都处理完了,在处理。因此inOrder(root.left);之后才是处理逻辑。
class Solution {
TreeNode pre = null;
int result = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
inOrder(root);
return result;
}
//中序遍历是左中右
//中序遍历的情况是,第一次访问结点的时候是不处理的,第二次访问才处理,
void inOrder(TreeNode root) {
if(root == null) return;
//左
inOrder(root.left);
//中
if(pre == null) {
//证明之前没到处理的时候,只是第一次访问而已。
//或者前一个节点是null
pre = root;
} else{
int cur = root.val-pre.val;
result = result<cur?result:cur;
}
//这一句是必须加的,关键就在这里,这里记录了上一个节点
pre = root;
//右
inOrder(root.right);
}
}
和代码随想录写的稍有不同: