(1)递归方法
class Solution {
public boolean isValidBST(TreeNode root) {
return helper(root,Long.MIN_VALUE,Long.MAX_VALUE);//表示最小值和最大值
}
public boolean helper(TreeNode node,long lower,long upper){
if(node==null) return true;
if(node.val<=lower||node.val>=upper){return false;}
return helper(node.left,lower,node.val)&&helper(node.right,node.val,upper); //判断两者都为真的时候返回真,一个不为真则返回false;更新左边的时候注意更新的是最大值,最小值为无穷小;更新右边的时候是更新最小值,最大值为无穷大;
}
}
(2)中序遍历法
class Solution {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack();
double pre = -Double.MAX_VALUE;//初始设置一个最小值,便于第一次比较
while(!stack.isEmpty()||root!=null){//当栈和树还不为空的时候遍历下去,root=null的情况是在叶子节点的时候继续向左或者向右下去,这个时候root=null,会直接跳过第二个while()循环,去把栈中的数据弹出来给root,然后向右子树方向走,如果右字树为null,则继续沿着左子树方向向上走,中序遍历完后得到的是从小到大的的数据排序
while(root!=null){//这里的作用不仅是沿着左子树走下去,还有树节点为空的时候跳过这个循环
stack.push(root);
root=root.left;
}
root=stack.pop();
if(root.val<=pre) return false;
pre=root.val;
root=root.right;
}
return true;
}
}