验证二插搜索树
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
所谓二插搜索树
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路:根据二插搜索树的特点,很容易想到二叉树的中序遍历,中序遍历一遍,树种的数据升序,
定义一个变量tmp,表示当前遍历结点的前一个值,只要判断当前结点值大于tmp,那么就一直遍历,直到遍历结束,否则返回false;
先看一下我当时提交的错误代码
case1:错误的原因就是没有判断左右结点,直接在结尾返回true,那么不管中间过程如何,结果一直是true
class Solution {
long tmp = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
//中序遍历就行了
if(root == null) return true;
isValidBST(root.left);
if(root.val > tmp){
tmp = root.val;
}else{
return false;
}
isValidBST(root.right);
return true;
}
}
正确的代码
class Solution {
long tmp = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
//中序遍历就行了
if(root == null) return true;
boolean left = isValidBST(root.left);
if(root.val > tmp){
tmp = root.val;
}else{
return false;
}
boolean right = isValidBST(root.right);
return left && right;
}
}