98. 验证二叉搜索树
😭,其实之前做过类似的题,但是一开始的思路还是没想到中序遍历,只是想到递归判断当前节点是否大于等于最大值或者小于等于最小值,针对于左子树,那么最大值应该是当前节点值,右子树那么最小值应该是当前值。根据这个思路就可以开始撸代码了。
public boolean isValidBST(TreeNode root) {
//用long的原因是居然存在测试用例用Int的最大值2,147,483,647
return getIsVaildBST(root,Long.MAX_VALUE,Long.MIN_VALUE);
}
public boolean getIsVaildBST(TreeNode root ,long max ,long min){
if(root == null){
return true;
}
if(root.val>=max || root.val <= min){
return false;
}
return getIsVaildBST(root.left,root.val,min) && getIsVaildBST(root.right,max,root.val);
}
因为题目的要求是验证二叉搜索树,那么可以得出树的中序遍历(先访问左节点在访问中间节点,然后右节点的最左节点)一定是递增的如果不是递增那么肯定不是二叉搜索树,因此也可以用中序遍历做这道题:
1.递归的方法中序遍历
Integer i;
public boolean isValidBST(TreeNode root) {
if(root== null){
return true;
}
if(!isValidBST(root.left)){
//先遍历左树
return false;
}
if(i!=null && root.val<= i){
//如果当前值比前一个值小就不成立
return false;
}
i = root.val;
//再遍历右节点
return isValidBST(root.right)
}
2.非递归中序遍历,通过栈保存根节点
public boolean isValidBST(TreeNode root) {
Deque<TreeNode> stack = new ArrayDeque<>();
Double preNodeVal = Double.MIN_VALUE;
while(!stack.isEmpty() || root != null){
while(root != null){
//遍历左树将当前根节点保存
stack.add(root);
root = root.left;
}
TreeNode tempTreeNode = stack.removeLast();
if(tempTreeNode.val<=preNodeVal){
//比上个节点小的话证明不是递增直接return
return false;
}
preNodeVal = tempTreeNode.val;
root = tempTreeNode.right;
}
return true;
}