给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/\
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
第一种方法:利用二叉搜索树的中序遍历,左边的都比父节点小,右边的都比父节点大,中序遍历后就是一个递增的集合序列,如果不是递增说明不是二叉搜索树
class Solution {
public boolean isValidBST(TreeNode root) {
List<Integer> list=new ArrayList<>();
mid(root,list);
if(list.size()<0)
return true;
for(int i=1;i<list.size();i++){
if(list.get(i-1)>=list.get(i)){
return false;
}
}
return true;
}
public List<Integer> mid(TreeNode root,List<Integer> list){
if(root!=null){
mid(root.left,list);
list.add(root.val);
mid(root.right,list);
}
return list;
}
}
第二种方法:使用递归,左边的永远比上一个小,右边的永远比上一个大,递归比较,
class Solution {
public boolean isValidBST(TreeNode root) {
//要设置最大值和最小值
return isBST(root,Long.MIN_VALUE,Long.MAX_VALUE);
}
public boolean isBST(TreeNode root,long min,long max)
{
if(root==null)
return true;
if(root.val<=min||root.val>=max)
{
return false;
}
//左子树,要改变上限,右子树要改变下限。
return isBST(root.left,min,root.val)&&isBST(root.right,root.val,max);
}
}