- 题目:给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例:输入:
2
/ \
1 3
输出: true
// 利用递归中序遍历
// preValue保存上一个遍历过的节点的值,用来与当前节点值做比较
public int preValue = Integer.MIN_VALUE;
// 为了通过leetcode令人无语的用例,设定一个count记录当前节点是不是树中第一次被访问的节点
public int count = 0;
public boolean isValidBST(TreeNode root){
// root == null 要作为左右子节点为空时的返回条件
if (root == null)
return true;
// 递归返回左树是不是一个搜索二叉树
boolean isLeftBst = isValidBST(root.left);
// 左树不是就直接返回
if(!isLeftBst){
return false;
}
// 中序遍历应该访问节点的位置改为判断前一个节点是否比当前节点小,也就是保持升序,据此判断是否搜索二叉树
if (count == 0 || preValue < root.val){
preValue = root.val;
count++;
}else{
return false;
}
// 结果就是右树是不是搜索二叉树
return isValidBST(root.right);
}
// 利用迭代中序遍历
public boolean isValidBST(TreeNode root){
if (root == null){
return false;
}
// 建立一个栈用于实现中序遍历
LinkedList<TreeNode> stack = new LinkedList<>();
int lastNum = Integer.MIN_VALUE;
int count = 0;
while (!stack.isEmpty() || root != null){
if (root != null){
stack.push(root);
root = root.left;
}else {
root = stack.pop();
// 判断搜索二叉树的部分
if (count == 0 || lastNum < root.val) {
lastNum = root.val;
count++;
}
else
return false;
root = root.right;
}
}
return true;
}