题目描述
难度:中等
示例
思路
使用递归算法
因为二叉搜索树定义本身就是递归的,所以我们自然而然会想到用递归算法来解决此问题。
解题方法
1.首先定义递归函数dfs,需要传入的参数为节点,下界,上界
2.dfs函数首先判断节点是否为空,为空则返回true。
再判断当前节点值是否在指定的上下界之间,不在范围内则返回false;
3.最后是dfs的关键步骤:递归地调用dfs函数:把左右节点传入dfs函数中,对于左节点,更新上界为当前节点值;对于右节点,下界更新为当前节点值。
4.调用dfs函数,传入头节点、Long.MIN_VALUE、 Long.MAX_VALUE递归求解
java代码
力扣官方题解+个人注解:
public boolean isValidBST(TreeNode root) {
//传参求解
return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isBST(TreeNode node, long lower, long upper) {
if(node == null) {
return true;
}
//判断当前节点值是否在上下界的范围内
if(node.val <= lower || node.val >= upper) {
return false;
}
//把左右节点放入函数递归求解
return isBST(node.left,lower, node.val) && isBST(node.right, node.val, upper);
}
}
复杂度分析:
时间复杂度
每个节点都被递归调用一次,因此时间复杂度为O(n)
空间复杂度
递归函数调用时需要为每一层递归函数分配栈区,递归的深度取决于二叉树的高度,即树的最长路径上的节点数量。
在最坏情况下,二叉树是一个单侧链表,其高度为 n,其中 n 是节点数量。因此空间复杂度为 O(n)