题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
方法一:辅助列表,判定中序遍历是否满足递增
class Solution {
//如果中序遍历的结果是满足递增的说明是搜索二叉树
List<Integer> res = new ArrayList<>();
public boolean isValidBST(TreeNode root) {
if(root==null)
return true;
inOrder(root);
for(int i=1;i<res.size();i++){ //检查列表中的值是否是严格递增
if(res.get(i)<=res.get(i-1)){
return false;
}
}
return true;
}
private void inOrder(TreeNode root){ //中序遍历
if(root!=null){
inOrder(root.left);
res.add(root.val); //将中序遍历的值添加进列表
inOrder(root.right);
}
}
}
方法二:中序遍历是直接比较值
class Solution {
long preValue = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if(root == null){ //假如头为空返回true
return true;
}
boolean isLeftBst = isValidBST(root.left); //检查左树是否是搜索二叉树
if(!isLeftBst){ //如果左树不是搜索二叉树 返回false
return false;
}
if(root.val <= preValue){ //假如当前节点的值比preValue小(即左树)则不是搜索二叉树
return false;
}else{ //如果当前值大 则将preValue设置成当前值
preValue = root.val;
}
return isValidBST(root.right);
}
}