题目地址(98. 验证二叉搜索树)
https://leetcode-cn.com/problems/validate-binary-search-tree/
题目描述
给你一个二叉树的根节点 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
前置知识
公司
- 暂无
思路

有两个地方有陷阱
- 不能单独判断左右子节点是否符合二叉搜索树的定义就完了 还会出现如下情况

我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点
- 样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。 此时可以初始化比较元素为longlong的最小值。
中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST,继续遍历;否则直接返回 false。
关键点
- 中序遍历下,输出的二叉搜索树节点的数值是有序序列。 有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了
代码
- 语言支持:Java
Java Code:
class Solution {//先定义一个最小值 题目中最小值的实例为long.minLong pre = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {//中止条件 如果遍历到最后没返回false就说明这是一颗二叉搜索树if (root == null) {return true;}//递归调用左边的子树 如果子树返回false 这里也返回falseif (!isValidBST(root.left)) {return false;}//pre代表的是前一个数 二叉搜索树的中序遍历顺序就是从大到小的顺序// 所以这里只需要判断前一个数是否小于当前节点值即可 如果不小于就返回falseif (pre >= root.val) {return false;}//如果到这里就说明前一个数字小于当前数 使当前数变为下一个数的最小值pre = Long.valueOf(root.val);return isValidBST(root.right);}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=gI17M)
- 空间复杂度:
#card=math&code=O%28n%29&id=pVwkM)
