题目描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
样例描述
思路
递归 + 树的中序遍历
- 由BST特性知道,中序遍历一定是有序的,只要判断中序遍历中当前结点的值是否一定比前面结点大即可,如果小肯定就是false。
- 预先设置
pre = Long.MIN_VALUE
是为了保证,如果左子树为空,这个条件就不成立,就不会返回false。 - 不能用INT_VALUE,因为结点的值刚好是int的范围,可能会出现边界问题,比如刚好等于边界。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
//空树肯定是bst
if (root == null) return true;
if (!isValidBST(root.left)) {
return false;
}
//如果中序遍历当前结点值小于等于前一个那肯定不是BST
if (root.val <= pre) {
return false;
}
pre = root.val;
if (!isValidBST(root.right)) return false;
return true;
}
}