每日一题--验证二叉搜索树

99 阅读1分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

题目

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

有效 二叉搜索树定义如下:

节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。  

示例 1:

输入:root = [2,1,3] 输出:true 示例 2:

输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。  

提示:

树中节点数目范围在[1, 104] 内 -231 <= Node.val <= 231 - 1


思路

咋一看题目没啥思路,仔细看完之后发现只要满足中序遍历,原因如下:

第一眼的想法也是中序遍历。二叉搜索树中序遍历得到升序,对给定的二叉树中序遍历,结果记录于res之中,检验res是否为严格的升序,若是则为true,反之false。

中序遍历是二叉树的一种遍历方式,它先遍历左子树,再遍历根节点,最后遍历右子树。而我们二叉搜索树保证了左子树的节点的值均小于根节点的值,根节点的值均小于右子树的值,因此中序遍历以后得到的序列一定是升序序列。

代码

 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function (root) {
    let res = []
     dfs = (root) =>{
        if (root === null) {
            return
        }
        dfs(root.left)
        res.push(root.val)
        dfs(root.right)
    }
    dfs(root)
    for (let i = 0; i<res.length; i++) {
        if(res[i] <= res[i-1]) return false
    }
    return true
};

时间复杂度 : O(n)O(n),其中 nn 为二叉树的节点个数。二叉树的每个节点最多被访问一次,因此时间复杂度为 O(n)O(n)。

空间复杂度 : O(n)O(n),其中 nn 为二叉树的节点个数。栈最多存储 nn 个节点,因此需要额外的 O(n)O(n) 的空间。