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

本文介绍了如何利用二叉搜索树的特性进行验证和计算最小绝对差。通过中序遍历的有序性质,实现验证二叉搜索树的正确性和查找节点间最小差值的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉搜索树简介

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

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值