给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
判断二叉搜索树的流程
如示例2所示:
我们可以引出一颗二叉树是否为二叉搜索树的判断过程:
二叉搜索树其左子树都要小于根节点,右子树都要大于根节点。
当这颗二叉搜索树为子树的时候,这棵树还需要在一个特定范围内 min , max,这个范围是其父节点确定的
0.递归的终止条件是如果根节点为null,那直接返回true。
1.判断根节点在不在既定范围min,max内(对于总根节点,其实它是没有范围限制的,但我们也为它规定一个范围,范围为Long类型能达到的最小值和最大值),如果其小于min或大于max, 根节点都不在范围内,则这棵树就不是二叉搜索树。返回false。反之则继续判断其左右子树是不是在合理范围内。
2.判断左子树是不是在(min,root.val)内,如果不是则这棵树也不是二叉搜索树(递归)
3.判断右子树是不是在(root.val,max) 内。如果不是则这棵树也不是二叉搜索树(递归)
class Solution {
public boolean isval(TreeNode root, long min, long max)//整棵树的取值范围为(min,max),判断其是否在该范围内
{
if(root==null)
return true;
if(root.val<=min||root.val>=max)//判断根节点在不在传入的范围内
return false;
boolean isleftval = isval(root.left, min, root.val);//左子树必须小于根节点,则左子树的范围为(min,root.val)
boolean isrightval = isval(root.right, root.val, max);//右子树必须大于根节点,则左子树的范围为(root.val,max)
if(isleftval==true&&isrightval==true)//当左子树,右子树,根节点都在正确的范围内时,该树为一个二叉搜索树
return true;
else
return false;
}
public boolean isValidBST(TreeNode root) {
return isval(root,Long.MIN_VALUE,Long.MAX_VALUE);
}
}