携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
二叉搜索树
二叉搜索树(Binary Search Tree),又称有序二叉树(Ordered Binary Tree)、排序二叉树(Sorted Binary Tree)。后两个别名更能让人理解二叉搜索树的含义。
二叉搜索树,首先它是一个二叉树,最多只能存在左右两个字节点。不仅如此,它的左右两节点还需要满足以下三个条件:
- 左子树上所有节点的值都要小于它的根节点的值
- 右子树上所有节点的值都要大于它的根节点的值
- 所有左子树和右子树自身也必须是二叉搜索树
左子树指的是父节点下以左节点为根节点的所有节点,同理,右子树指的就是父节点下以右节点为根节点的所有节点。
验证二叉搜索树
描述
给你一个二叉树,判断其是否是一个有效的二叉搜索树。
二叉搜索树需要满足的条件在上面已经列举了,满足即是有效的,否则就是无效二叉树。
分析
如果节点没有左右子节点,也算是二叉搜索树,可知如果值为空,不能返回false;
根据二叉树的条件综合可知,其实就是任何一个存在左右子节点的部分树都需要满足左节点小于父节点,并且右节点大于父节点。如果这当做一个模块,那就是需要遍历,所有的子模块满足这个条件即可;
由于我们是校验二叉搜索树的有效性,也就是说只要有一个不符合则全盘否掉,那我们主要是要找到不符合的条件,然后不断遍历这个过程。
程序实现
根据以上分析,程序实现如下:
const helper = (root, lower, upper) => {
if (!root) return true
// 只要存在父节点值小于等于左节点值或父节点值大于等于右节点值即返回false
if (root.val <= lower || root.val >= upper) {
return false
}
return helper(root.left, lower, root.val) && helper(root.right, root.val, upper)
}
var isValidBST = function(root) {
return helper(root, -Infinity, Infinity)
}