解题思路:
开始想着像层序遍历二叉搜索树一样,用队列保存每个节点再来检查,后面发现使用队列的原因是因为需要层序遍历,用来验证不需要开辟一个空间用来保存节点,又因为每个节点都可以作为二叉搜索树的头节点,因此可以采用递归的方式来验证
递归三部曲
1、终止条件
当验证的节点为空时,返回true,因为节点为空,所以一定满足二叉搜索树的条件
2、递归操作
定义递归方法
function validBST(root, min, max){}
由于二叉搜索树的特点,左子树小于当前节点的数,右子树大于当前节点的数,而节点会同时作为某个节点的左子树或右子树,因此节点的值时处于一个范围之内的,因此递归条件是通过不断刷新节点的区间范围,如果满足这个区间,那么就接着往下递归,如果不满足,直接返回false
范围区间的定义
由于二叉搜索树不断往下遍历,因此其实节点的值的范围是越来越小的,而结合二叉搜索树的特点,我们能得到范围区间刷新公式,假设该节点为root 首先验证root的值是否在范围区间中,那到底是验真还是验假呢,当然是验假,因为如果为假则可以直接跳出循环返回false,验假的条件是:
if(root.val <= min || root.val >= max) return false
3、递归返回值
验证完当前节点那么就要检测其左右节点,我们可以直接采用return来进行更新验证
更新左节点的最大值为当前父节点,更新右节点的最小值为当前父节点,其他区级范围不变
return validBST(root.left, min, root.value) && valiBST(root.right, root.value, max)
当层层递归的结果都为true时,结果才会返回true,而出现一个false时,因为是与运算符,结果为false
调用递归方法
validBST(root, -Infinity, Infinity)