算法day19 | Java | 二叉树 | LeetCode 530(未完)

51 阅读1分钟

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);
    }
}

和代码随想录写的稍有不同:

image.png