「这是我参与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)
};
解二
- 先对二叉树进行中序遍历,如果是二叉搜索树,得到的数组必定是有序递增的
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
};
迭代
- 跟之前的前序遍历差不多逻辑
- 使用一个栈去存储所有的左子树,直到最后一个
- 此时开始出栈操作,比较右边的节点是否比左边的节点大
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
}
Tips:
同一个题目可以有多个写法,如果是用递归的写法,需要按“三步曲”走,确认好递归终止的条件和单层处理的逻辑。