思路:1.直接根据定义来,左子树 < 根 < 右子树
2.利用二叉搜索树的性质:二叉搜索树的中序遍历是递增的
利用定义
// 输入为[2147483647]时,超出了Integer的范围,所以用Long
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode root, long minVal, long maxVal) {
if(root == null){
return true;
}
if(root.val >= maxVal || root.val <= minVal){
return false;
}
return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}
}
利用中序遍历
递归写法
class Solution {
TreeNode prev;
public boolean isValidBST(TreeNode root) {
if(root == null){
return true;
}
//访问左子树
if(!isValidBST(root.left)){
return false;
}
//访问当前节点:如果当前节点大于等于中序遍历的前一个节点直接返回false。
if(prev != null && root.val >= prev.val){
return false;
}
//保存前一个访问的结点
prev = root;
//访问右子树
if(!isValidBST(root.right)){
return false;
}
return true;
}
}
非递归写法
class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null)
return true;
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
if(cur != null){
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
// 如果中序遍历得到的节点的值小于等于前一个,说明不是二叉搜索树
if(pre != null && cur.val <= pre.val){
return false;
}
//保存前一个访问的结点
pre = cur;
cur = cur.right;
}
}
return true;
}
}