错误解法:以为遍历的时候每次查看是否left < root < right就行,但是忽略了左子树必须全部小于root
递归解法就需要每次传入两个界,min max,是根据当前的parent已经parent的情况确定的。要注意test case就是MAX_VALUE MIN_VALUE,
因为定义中是严格大于小于 所以在判断非法树的时候 写的是root.val >= max || root.val <= min, 这样的话即使合法也会返回false,因为等于号。
所以要用root.val > max || root.val< min判断 同时下一层的时候要将min=root.val-1 。这样的话就要提前判断假如是MAX_VALUE就不能再有右子 左边一样。
public class Solution {
public boolean isValidBST(TreeNode root) {
return helper(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
public boolean helper ( TreeNode node, int min, int max){
if ( node == null)
return true;
if ( node.val > max || node.val < min)
return false;
if ( node.val == Integer.MIN_VALUE && node.left != null )
return false;
if( node.val == Integer.MAX_VALUE && node.right != null )
return false;
return helper( node.left, min, node.val-1) && helper( node.right, node.val+1, max);
}
}
还有一种解法就是用中序遍历,但是需要记录一个pre,我在pre是什么 在什么地方更新卡住了 以及pre是null的情况要判断 pre初始值为null
仔细看else里面对pre的处理,pre其实就是上次pop出来的。而他不能大于这次pop出来的 并且要更新pre
public class Solution {
public boolean isValidBST(TreeNode root) {
Stack <TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
TreeNode pre = null;
while ( !stack.isEmpty() || cur != null){
if ( cur != null ){
stack.push(cur);
cur = cur.left;
}
else{
TreeNode top = stack.pop();
if ( pre != null && pre.val >= top.val )
return false;
pre = top;
cur = top.right;
}
}
return true;
}
}