📝Leetcode 验证二叉搜索树

130 阅读1分钟

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

题目🌵

📝Leetcode 验证二叉搜索树

✏️leetcode-cn.com/problems/va…


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

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

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

示例 1:

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

解题思路💡

递归

  • 首先根据题意,我们可以遍历这课树
  • 递归有“三步曲”
    • 确定递归参数和返回值
    • 确定递归的终止条件
    • 单层递归所需要做的事情

根据题目,二叉搜索树是左子树小于根节点,右子树大于根节点。

Warning:不是简单的 root.val>root.left.val && root.val<root.right.val

var isValidBST = function (root, lower = -Infinity, upper = Infinity) {
    if (!root) return true
    if (root.val >= upper || root.val <= lower) return false
    return isValidBST(root.left, lower, root.val) && isValidBST(root.right, root.val, upper)
};

image-20220130230455668

解二

  • 先对二叉树进行中序遍历,如果是二叉搜索树,得到的数组必定是有序递增的
var isValidBST = function (root) {
    // 先对树进行中序遍历
    const cache = []
    const traversal = (root, cache) => {
        if (!root) return
        traversal(root.left, cache)
        cache.push(root.val)
        traversal(root.right, cache)
    }
    traversal(root, cache)
    // 中序遍历结束
    // 对cache结果循环  看下是否是有序递增序列
    for (let i = 0; i < cache.length - 1; i++) {
        if (cache[i] >= cache[i + 1]) return false
    }
    return true
};

image-20220131001940152

迭代

  • 跟之前的前序遍历差不多逻辑
  • 使用一个栈去存储所有的左子树,直到最后一个
  • 此时开始出栈操作,比较右边的节点是否比左边的节点大
var isValidBST = function (root) {
    let stack = []
    let current = root
    let prev = null
    while (current || stack.length > 0) {
        while (current) {
            stack.push(current)
            current = current.left
        }
        current = stack.pop()
        if (prev && current.val <= prev.val) {
            return false
        }
        prev = current
        current = current.right
    }
    return true
}

image-20220131003655819

Tips:

同一个题目可以有多个写法,如果是用递归的写法,需要按“三步曲”走,确认好递归终止的条件和单层处理的逻辑。