给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: 2 / \ 1 3 输出: true示例 2:
输入: 5 / \ 1 4 / \ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。
写的好崩溃。。。
需要注意,二叉搜索树的左边节点均小于根节点,右边节点均大于根节点。掌握这一点就可以了。
在最下方附上部分比较特殊的测试用例,提交之前可以跑一下。
我的解答:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isBST(TreeNode root, long min, long max) {
// 作为一个标识,true && false == false;true && true == true;
boolean ret = true;
// 先判空
if (root == null) {
return true;
}
// 判断根节点是否在范围内,主要用于后期递归
if (root.val >= max || root.val <= min) {
return false;
}
// 叶子节点
if (root.right == null && root.left == null) {
return true;
}
// 单右树情况
if (root.left == null && root.right != null) {
if (root.val >= root.right.val || root.right.val > max) {
return false;
} else {
return ret && isBST(root.right, root.val, max);
}
}
// 单左树情况
if (root.right == null && root.left != null) {
if (root.val <= root.left.val || root.left.val < min) {
return false;
} else {
return ret && isBST(root.left, min, root.val);
}
}
// 左右均不为空
if (root.left != null && root.right != null) {
if (root.left.val < root.val && root.val < root.right.val) {
return ret && isBST(root.left, min, root.val) && isBST(root.right, root.val, max);
} else {
return false;
}
}
return ret;
}
}
部分测试用例:
[5,1,4,null,null,3,6]
[1,1]
[10,5,12,1,2,8,13]
[10,5,15,null,null,6,20]
[]
[3,1,5,0,2,4,6,null,null,null,3]
[2147483647]
[-2147483648,null,2147483647]