给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
方法一:直接中序遍历出结果,然后判断结果是不是升序排列,不用判断上下界
class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
List<Integer> list = new ArrayList<>();
core(root, list);
if (list.size() < 2) return true;
for (int i=1;i<list.size();i++) {
if (list.get(i-1) >= list.get(i))
return false;
}
return true;
}
private void core(TreeNode node, List<Integer> list) {
if (node == null) return;
core(node.left, list);
list.add(node.val);
core(node.right, list);
}
}
方法二:
class Solution {
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 访问左子树
if (!isValidBST(root.left)) {
return false;
}
// 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
if (root.val <= pre) {
return false;
}
pre = root.val;
// 访问右子树
return isValidBST(root.right);
}
}
方法三
class Solution {
public boolean helper(TreeNode node, Integer lower, Integer upper) {
if (node == null) return true;
int val = node.val;
if (lower != null && val <= lower) return false;
if (upper != null && val >= upper) return false;
if (! helper(node.right, val, upper)) return false;
if (! helper(node.left, lower, val)) return false;
return true;
}
public boolean isValidBST(TreeNode root) {
return helper(root, null, null);
}
}