题目描述
实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/le… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
首先需要了解什么是二叉搜索树
二叉搜索树(BST),就是其根节点,左子树所有节点的值要小于根节点,右子树所有子节点的值要大于根节点。 并且所有子节点为根节点的树也满足
解题过程
新增一个函数,递归判断每个节点为根节点的树是否是BST,直到叶子节点 因为这里,只要有一个节点不满足,就不是BST
- 递归时候我们需要传入,需要判断的节点,节点值不能超过的最小值,和最大值
- 根节点的最小最大值为政府无穷大
- 一个节点的值 root.val<=min||root.val>=max的话,则不是BST返回false
- 否则就继续递归判断其左右子节点,其中左子节点一定比当前子节点小,所以重新定义下限,把自己的值作为下限传入,上限不变
- 右子节点必须大于当前节点值,所以重新定义其上限为当前节点值,下限值不变
- 直到判断到空节点 返回true
代码
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isValidBST = function(root,) {
return childIsBst(root,-Infinity,Infinity)//根节点没有上下限,传入政府无穷大
};
/**判断一棵树是否是二叉搜索树
*/
var childIsBst=function(root,min,max){
if(!root) return true;
if(root.val<=min||root.val>=max){
//节点值必须在区间内,否则就返回false
return false;
}
//不是以上情况,就继续递归,
return childIsBst(root.left,min,root.val)&&childIsBst(root.right,root.val,max)
}