目录
题目描述:
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
-
节点的左 子树
只包含小于当前节点的数。
-
节点的右子树只包含 大于 当前节点的数。
-
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
代码:
第一种:
范围递归
public boolean isValidBST(TreeNode root) {
return isValid(root,Long.MIN_VALUE,Long.MAX_VALUE);
}
private boolean isValid(TreeNode root, long minValue, long maxValue) {
if(root==null){
return true;
}
if(root.val<=minValue||root.val>=maxValue){
return false;
}
return isValid(root.left,minValue,root.val)&&isValid(root.right,root.val,maxValue);
}
第二种:
中序递归
long pre=Long.MIN_VALUE;
public boolean isValidBST2(TreeNode root) {
if(root==null){
return true;
}
boolean a=isValidBST2(root.left);
//此时a已经为false,但还是会继续往下进行下去的
if(!a){
return false;
}
if(pre>=root.val){
return false;
}
pre=root.val;
return isValidBST2(root.right);
}
第三种:
中序非递归
public boolean isValidBST1(TreeNode root) {
TreeNode p = root;
LinkedList<TreeNode> stack = new LinkedList<>();
long prev =Long.MIN_VALUE;
while (p != null || !stack.isEmpty()) {
if(p!=null){
stack.push(p);
p = p.left;
}else{
TreeNode pop= stack.pop();
if(prev>=pop.val){
return false;
}
prev = pop.val;
p=pop.right;
}
}
return true;
}