二叉搜索树介绍和两个相关运用的算法

60 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

二叉搜索树简介

二叉搜索树最本质的特征就是,左节点<父节点<右节点,用直观一点的图来标识就是下图 在这里插入图片描述 如果稍微扩充一下就是 在这里插入图片描述 思考一下两个树的中序遍历结果是什么?这是搜索二叉树非常重要的性质。 而我们将使用这一性质,来完成下面两个算法

98.验证二叉搜索树

根据上面的性质,中序遍历是从小到大的,这样我们就可以在中序遍历的时候将大小比出来,现在先在大脑里思考一下二叉树的中序遍历。 这是一段中序遍历的伪代码

while(栈不为空 || 二叉树不为空){
xxx入栈

xxx出栈
}

下面是这个题目的完整解题代码

class Solution {
    public boolean isValidBST(TreeNode root) {  
        double num = -Double.MAX_VALUE;
        Stack<TreeNode> stack = new Stack();
        while(!stack.isEmpty() || root != null){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            if(root.val <= num){
                return false;
            }
            num = root.val;
            root = root.right;
        }
        return true;
    }
}

这个算法是我们在中序遍历的基础上,使用一个数字暂存了前一个弹出的节点的值,然后比较大小

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

回顾一下题目,这个题目就是要你找出节点之间相减,最小的绝对值。 因为搜索二叉树的中序遍历是有序的,所以只要比较中序遍历中的前一个节点减后一个节点的绝对值就可以找出最小值。

和上面的一样,这样我们就要暂存两个值,一个是前一个节点的值,一个是相减的绝对值

class Solution {
    public int getMinimumDifference(TreeNode root) {
        Stack<TreeNode> stack = new Stack();
        int abs = Integer.MAX_VALUE;
        TreeNode pre = null;

        while(root != null || !stack.isEmpty()){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();

            if(pre != null){
                abs = Math.min(abs, root.val - pre.val);
            }
            pre = root;
            root = root.right;
        }

        return abs;
    }
}