Leetcode 530 二叉搜索树的最小绝对差

题意理解

        什么是二叉搜索树的最小绝对差

        首先明确:二叉搜索树的中序遍历是严格的单调递增序列。

        二叉搜索树的最小绝对差,指的是该递增序列两相邻数间的最小差值。

        即前一个节点和后一个节点的值差的绝对值修小是多少?

确定遍历方式:

        中序遍历——得到有序的严格单调递增序列

依然是两种解题思路:

        递归    迭代

        其区别在于由方法栈来实现递归还是由自定义栈模拟递归过程

        方法栈总数保存了和方法相关的各个值状态,自定义栈只保存需要保存的节点信息,不那么容易造成栈溢出。

1.递归

一般来说,递归的思路更为容易理解一些。

//保存最小绝对差
    int minDiff=Integer.MAX_VALUE;
    //保存前一个节点值
    TreeNode pre=null;
    /**
     * 什么是最小绝对差:中序遍历的前后两个数之间的最小绝对差
     * 众所周知:二叉搜索树的中序遍历是严格的单调递增序列
     * 其次,由于输入限制,不会传入空树,其至少两个节点,即至少满足一次计算
     * @param cur
     * @return
     */
    //递归法
    public int getMinimumDifference(TreeNode cur) {
        //为充分利用二叉搜索树的性质,采用中序遍历
        if(cur.left!=null) getMinimumDifference(cur.left);
        if(pre!=null) minDiff=Math.min(minDiff,Math.abs(pre.val- cur.val));
        pre=cur;
        if(cur.right!=null) getMinimumDifference(cur.right);

        //总是返回最小差值的绝对值
        return minDiff;
    }

2.迭代

迭代和递归的思路其实是一样的,只是由自定义栈来模拟递归过程,来阻止栈溢出。

//迭代
    public int getMinimumDifference2(TreeNode cur) {
        //记录栈的操作过程,模拟递归
        Stack stack=new Stack();
        stack.push(cur);
        //记录前一个节点
        TreeNode pre=null;
        //记录最小差值
        int minDiff=Integer.MAX_VALUE;
        while(!stack.isEmpty()){
            TreeNode tmp=stack.peek();
            if (Objects.nonNull(tmp)){
                //根节点不为空,构造其中序遍历顺序
                stack.pop();
                //考虑栈先进后出,倒序入栈
                //对左右节点判空,则正常节点入栈不会引入null
                //引入null的原因是下一个出栈的一定是中间节点
                if(Objects.nonNull(tmp.right)) stack.push(tmp.right);
                stack.push(tmp);
                stack.push(null);
                if(Objects.nonNull(tmp.left)) stack.push(tmp.left);
            }else{
                //弹出null值
                stack.pop();
                //获取中间节点,中间节点的处理
                tmp=stack.pop();
                if(pre!=null) minDiff=Math.min(minDiff,Math.abs(pre.val- tmp.val));
                pre=tmp;
            }
        }
        return minDiff;
    }

3.分析

 时间复杂度:

        递归:O(n)

        迭代:O(n)

 空间复杂度:

        递归:O(1)

        迭代:O(n)

你可能感兴趣的:(刷题训练营,算法,数据结构)