题目大意
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
解题思路
方式一:中序遍历 升序
利用中序遍历 后,判断是否是升序即可,但凡有一个不是升序的直接就返回false
class Solution {
TreeNode max;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
//left
boolean left = isValidBST(root.left);
if (!left) {
return false;
}
if (max != null && root.val <= max.val) {
return false;
}
max = root;
//left
boolean right = isValidBST(root.right);
return right;
}
方式二:分治思想
class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
return helper(root, null, null);
}
/**
* 对于一个节点来说 先给他一个范围[min,max]
* 判断当前节点v是否在这个范围里面,如果不在直接就return false ,否则继续递归
* 递归操作时 左子树从 [min,v-1] ,对于右子树从[v+1,max]
*/
private boolean helper(TreeNode root, Integer min, Integer max) {
if (root == null) {
return true;
}
if ((max != null && root.val >= max) || (min != null && root.val <= min)) {
return false;
}
//区间范围 [min,val]
boolean left = helper(root.left, min, root.val);
//[val,max]
boolean right = helper(root.right, root.val, max);
return left && right;x
}
}