98. 验证二叉搜索树
难度中等1407
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路
验证一棵树是不是BST树,我们必须对BST的定义非常清楚
- 左子树的所有节点的值都小于当前节点的值
- 右子树的所有节点的值都大于当前节点的值
因此我们在进行递归遍历的时候需要保留从根节点到当前节点的最大值以及最小值
由于题目中说明了每个节点的值可以取到int范围的所有数字,那么我们在指定最小值的时候只能是指定long类型的最小值,不然会出问题
所以在解题的时候需要注意给的数据范围,如果给的数据范围非常大那就不要考虑暴力法了,99%都会超时
package cn.edu.xjtu.carlWay.tree.validateBinarySearchTree;
import cn.edu.xjtu.Util.TreeNode.TreeNode;
/**
* 98. 验证二叉搜索树
* 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
* <p>
* 有效 二叉搜索树定义如下:
* <p>
* 节点的左子树只包含 小于 当前节点的数。
* 节点的右子树只包含 大于 当前节点的数。
* 所有左子树和右子树自身必须也是二叉搜索树。
* <p>
* https://leetcode-cn.com/problems/validate-binary-search-tree/
*/
public class Solution {
public boolean isValidBST(TreeNode root) {
return validBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean validBST(TreeNode root, long minValue, long maxValue) {
if (root == null) {
return true;
}
if (root.val < maxValue && root.val > minValue) {
return validBST(root.left, minValue, root.val) && validBST(root.right, root.val, maxValue);
}
return false;
}
}