98.验证二叉搜索树Java
题目描述
给定一个二叉树,判断它是不是一个有效的二叉搜索树。
二叉搜索树满足:节点的左子树只包含小于当前节点的数;节点的右子树只包含大于当前节点的数;所有左子树和右子树自身必须也是二叉搜索树。
输入输出样式
示例1:
输出:true
示例2:
输出:false,因为根节点5的右子树中出现了比它小的4,不满足二叉搜索树的性质。
本题来自LeetCode:https://leetcode-cn.com/problems/validate-binary-search-tree/
思路
方法一:递归。根据二叉搜索树的性质,遍历节点root,判断节点的值是否在范围(low, high)内,如果不在范围内说明不满足二叉搜索树直接返回fasle,如果满足那么需要继续递归检查左右子树是否也满足。这里需要注意的是:当进入左子树时,取值范围应该改为(low, root.val),因为左子树的值必须小于根节点;同理,进入右子树时,取值范围改为(root.val, high)。
方法二:因为二叉搜索树的中序遍历序列是一个递增的序列,因此也可以对目的树进行中序遍历,如果不满足升序则返回false。
算法分析
时间复杂度O(n),空间复杂度为O(n)
求解函数
public boolean isValidBST(TreeNode root) {
//初始取值范围为最大和最小的long型数值
return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean helper(TreeNode root, long low, long high) {
if (root == null) {
return true;
}
//如果不满足在取值范围内则返回false
if (root.val <= low || root.val >= high) {
return false;
} else {
//如果根节点满足在取值范围内,则返回递归调用左右子树的情况
//这里注意是&&,必须左右子树都满足
return helper(root.left, low, root.val) && helper(root.right, root.val, high);
}
}