98. 验证二叉搜索树
1、题目
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:

输入:root = [2,1,3] 输出:true
示例 2:

输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
- 树中节点数目范围在
[1, 104]
内 -231 <= Node.val <= 231 - 1
Related Topics
- 树
- 深度优先搜索
- 二叉搜索树
- 二叉树
2、题目分析
二叉搜索树:对于每个节点,都满足其左子树节点小于当前节点,其右子树节点大于当前节点。
故我们遍历每个节点时,要把其左子树节点先遍历到。类似于左 中 右的中序遍历方式
3、复杂度最优解代码示例
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Solution {
public boolean isValidBST(TreeNode root) {
// 调用辅助方法进行验证,初始时,最小值和最大值为null
return isValidBST(root, null, null);
}
// 辅助方法,递归验证二叉搜索树
private boolean isValidBST(TreeNode node, Integer min, Integer max) {
// 边界条件:如果节点为空,直接返回true
if (node == null) {
return true;
}
// 如果节点的值不在[min, max]的范围内,则返回false
if ((min != null && node.val <= min) || (max != null && node.val >= max)) {
return false;
}
// 递归检查左子树和右子树
// 对于左子树,最大值更新为当前节点的值
// 对于右子树,最小值更新为当前节点的值
return isValidBST(node.left, min, node.val) && isValidBST(node.right, node.val, max);
}
}
4、适用场景
将有序数组转换为二叉搜索树(BST)的操作在多个场景中都有其应用,以下是一些具体的适用场景:
- 算法教学与学习:这个操作常用于教授递归和二叉树的基本概念,帮助学生理解二叉搜索树的性质和构建方法。
- 数据结构转换:在某些情况下,需要将有序数组转换为二叉搜索树,以便利用二叉搜索树的特性进行高效的查找、插入和删除操作。
- 平衡性检查:通过将有序数组转换为二叉搜索树,可以检查树的平衡性,这对于保持数据的有序性和提高搜索效率至关重要。
- 数据库索引:在数据库系统中,二叉搜索树常用于构建索引结构,将有序数组转换为二叉搜索树有助于快速定位和检索数据。
- 文件系统管理:在文件系统中,二叉搜索树可以用于管理和优化文件的存储结构,将有序数组转换为二叉搜索树有助于提高文件的查找和访问速度。
- 游戏开发:在游戏中,可能需要根据一定的规则对对象进行排序和检索,将有序数组转换为二叉搜索树可以提供高效的数据访问方式。
- 机器学习:在机器学习领域,二叉搜索树可以用于构建决策模型,将有序数组转换为二叉搜索树有助于快速评估和选择最佳的特征和参数。
- 图的遍历:在图论中,二叉搜索树可以用于表示图的层次结构,将有序数组转换为二叉搜索树有助于分析图的性质和进行图的遍历。