43.验证二叉搜索树

题目链接

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

解法1 递归

思路

验证二叉搜索树,可以参考验证对称二叉树的思想递归的去分解子问题。首先左子树的是二叉搜索树并且左子树的所有节点小于根节点,右子树也是二叉搜索树并且右子树的所有节点都大于根节点。

最开始的时候我写出了这样的代码:

js 复制代码
function isValidBST(root: TreeNode | null): boolean {
    if (!root) return true;

    if (root.left?.val && root.left.val >= root.val) {
        return false; // 只比较了左节点和根节点的值大小
    }

    if (root.right?.val && root.right.val <= root.val) {
        return false; // 只比较了右节点和根节点的值大小
    }

    const isValidLeft = isValidBST(root.left);
    const isValidRight = isValidBST(root.right);

    return isValidLeft && isValidRight;
};

这样的代码的问题在于,只比较了左右节点和根节点的值大小 ,而不是所有左右子树的节点大小,所以我们需要一个额外区间参数来规定该节点的值,如果超出了,那就不是二叉搜索树。所以我们需要一个辅助函数来去规定根节点值的 lowerupper。然后再递归时更新左右子树的lowerupper

代码

js 复制代码
function isValidBST(root: TreeNode | null): boolean {
    const helper = (node, lower, upper) => {
        if (!node) return true;
        if (node.val <= lower || node.val >= upper) return false;
        return helper(node.left, lower, node.val) && helper(node.right, node.val, upper);
    }

    return helper(root, -Infinity, Infinity);
};

时空复杂度

时间复杂度:O(n)

空间复杂度:O(logn)

解法2 中序遍历法

思路

既然是一个二叉搜索树,那它的中序遍历一定是严格递增的,不可能存在当前节点比前一个节点小的情况。

所以根据这个特性,用一个变量 prev 来保存上一个节点的值,先处理左子树,然后比较节点,比较完之后处理右子树。

代码

js 复制代码
function isValidBST(root: TreeNode | null): boolean {
    let prev: number | null = null;  // 记录上一个节点的值

    function inorder(node: TreeNode | null): boolean {
        if (!node) return true;  // 走到空节点说明到头了

        // 1. 先遍历左子树
        if (!inorder(node.left)) return false;

        // 2. 然后处理当前节点
        if (prev !== null && node.val <= prev) {
            return false;  // 中序遍历要求严格递增
        }
        prev = node.val;  // 更新 prev

        // 3. 最后遍历右子树
        return inorder(node.right);
    }

    return inorder(root);
}

时空复杂度

时间复杂度:O(n)

空间复杂度:O(logn)

相关推荐
夏幻灵1 小时前
HTML5里最常用的十大标签
前端·html·html5
Mr Xu_1 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝1 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions1 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发1 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_1 小时前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞051 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、2 小时前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao2 小时前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
YuTaoShao2 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法