持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: root = [2,1,3]
输出: true
思路分析:
验证一个二叉树是否为有效的二叉搜索树,我们首先想到的是按照要求,只需要判断左子树小于根节点,右子树大于根节点就行了,然后不停的递归判断每一个子树满足条件就继续往下判断,如果不满足则停止递归并返回。
var isValidBST = function(root) {
//递归判断左右子树
let deep = (node)=>{
if(!node)return true
if(node.left&&node.left.val>=node.val||node.right&&node.right.val<=node.val)return false
return deep(node.left)&&deep(node.right)
}
return deep(root)
};
在实际运行中会发现在左右子节点下面还会有新的左右子树,我们还需要判断新的左右子树是否满足自身也是二叉搜索树的条件,需要判断左子树的下属右子树是否小于根节点,右子树的下属左子树是否大于根节点。以及下属子树的下属子树是否也满足条件。
这就需要我们在递归的时候携带上参数,给左子树带上最大值,左子树的值都不能大于该值,给右子树带上最小值,右子树都不能小于该值,并将该值递归带到每一层进行判断
var isValidBST = function(root) {
let deep = (node,min,max)=>{
if(!node)return true
if(node.val>=min||node.val<=max)return false
return deep(node.left,node.val,max)&&deep(node.right,min,node.val)
}
return deep(root,Infinity,-Infinity)
};