Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
啊啊啊啊啊这道题最贱的地方在于!!!你要考虑这种情况:
4 虽然放在2的后面是对的,但是4比root借点3要大啊!也就是说4本来是应该放到右边的subtree上去的,结果放到了左边,也就是说违反了BST重要的原则之一:left subtree的所有节点都小于根节点,right subtree的所有节点都大于root节点。
也就是说任意一个节点应该 > 左上的结点,但是又小于左上的结点继承过来的root。也就是说,比如说对4来说,4需要 2 < 4 < 3。
所以这个recursive,通过递归来更新每一个节点的min和max的判断。
public boolean isValidBST(TreeNode root){
return helper(root,null,null);
}
public static boolean helper(TreeNode root, Integer min, Integer max){
if(root==null) return true;
if(max!=null && root.val >= max) return false;
if(min!=null && root.val <= min) return false;
return helper(root.left,min,root.val) && helper(root.right, root.val, max);
}
顺便再附上一个好理解的,不过效率低,通不过leetcode。
就是每一个root要大于左子树的最大值,root要小于右子树的最小值:
//below is simple method but not efficient
public boolean isBST(TreeNode root){
if(root == null)
return true;
if(root.left!=null && root.left.val > max(root.left))
return false;
if(root.right!=null && root.right.val < min(root.right))
return false;
return isBST(root.left) && isBST(root.right);
}
private int max(TreeNode root){
int max = root.val;
while(root.right!=null){
max = root.right.val;
}
return max;
}
private int min(TreeNode root){
int min = root.val;
while(root.left!=null){
min = root.left.val;
}
return min;
}