题目描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
涉及tag
二叉树
算法思路
递归判断:
1 找终止条件:什么时候递归到头?当有一个节点的值不在以左子树值和右子树值为上下界的区间范围内
if (root.val <= lower || root.val >= upper) {
return false;
}
2 递归返回值:每一步递归应该向上返回什么样的信息?当前子树是否为二叉搜索树
return isValidBSThelp(root.left, lower, root.val) && isValidBSThelp(root.right, root.val, upper);
3 递归的单层逻辑应该怎么写:每一步递归应该做什么?递归就是大量重复调用,此时只需要考虑一个节点,根节点,后面再让左右子树轮流成为根节点
结合二叉搜索树的性质,用中序遍历后的结果帮助判断:
将二叉搜索树中序遍历之后各个节点的值严格按照升序排列,只要比较每一个节点的值都大于上一个节点,说明就是二叉搜索树
示例代码1
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBSThelp(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBSThelp(TreeNode root, long lower, long upper) {
if (root == null) {
return true;
}
if (root.val <= lower || root.val >= upper) {
return false;
}
return isValidBSThelp(root.left, lower, root.val) && isValidBSThelp(root.right, root.val, upper);
}
}
示例代码2
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);
}
}
}