LeetCode [中等]98. 验证二叉搜索树
98. 验证二叉搜索树 - 力扣(LeetCode)
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路
由于数据范围限制了二叉搜索树中的结点值的取值范围,因此上述取值范围可以用闭区间表示。对于二叉搜索树的每一个子树(包括原二叉搜索树本身),如果其结点值的取值范围是 [lowerBound,upperBound],子树的根结点值为 mid,则该子树的左子树和右子树的结点值取值范围分别是 [lowerBound,mid−1] 和[mid+1,upperBound]。
判断给定的二叉树是否是二叉搜索树,可以通过判断给定的二叉树的每一个子树是否是二叉搜索树,即每一个子树是否都满足结点值在特定取值范围内。从根结点开始遍历二叉树,对于每个结点,判断其子树的结点值是否在特定取值范围内。
上述过程是一个递归的过程。递归的终止条件有两种情况。
-
当前结点为空,空树是二叉搜索树。
-
当前结点不为空且当前结点值不在特定取值范围内,二叉树不是二叉搜索树。
对于其余情况,根据当前子树的取值范围和当前结点值确定左子树和右子树的取值范围,对左子树和右子树调用递归。
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
//精度问题,设置为long类型
public class Solution {
public bool IsValidBST(TreeNode root) {
return IsValidBST(root, long.MinValue, long.MaxValue);
}
public bool IsValidBST(TreeNode node, long lowerBound, long upperBound)
{
if(node == null)
{
return true;
}
if(node.val < lowerBound || node.val > upperBound)
{
return false;
}
return IsValidBST(node.left, lowerBound, (long) node.val - 1) &&
IsValidBST(node.right, (long) node.val +1, upperBound);
}
}
-
时间复杂度:O(n),其中 n 是二叉树的结点数。每个结点都被访问一次。
-
空间复杂度:O(n),其中 n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O(n)。