package com.atuigu.java;
import java.util.Stack;
class Solution {
// 递归
TreeNode max;
public boolean isValidBST(TreeNode root) {
if(root == null){
return true;
}
// 左
boolean left = isValidBST(root.left);
if(!left){//left为false 则返回false
return false;
}
// 中
if(max != null && root.val <= max.val){
return false;
}
max = root;
// 右
boolean right = isValidBST(root.right);
return right;
}
//迭代法
public boolean isValidBST1(TreeNode root) {
if(root == null){
return true;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
while(root != null || !stack.isEmpty()){
while (root != null){
stack.push(root);
root = root.left;// 左结点 相当于递归遍历到最左边的左节点
}
// 中结点, 处理做判断
TreeNode pop = stack.pop();// 弹出一个pop 紧接着与pre.val作比较
if (pre != null && pop.val <= pre.val){// 即按照中序遍历,pre的值大于了后面的值 则返回false
return false;
}
pre = pop;// 比较过后, 将pop记为pre
root = pop.right;// 右结点
}
return true;
}
//简洁实现*递归
public boolean isValidBST2(TreeNode root) {
return validBST(Long.MIN_VALUE, Long.MAX_VALUE, root);
}
private boolean validBST(long lower, long upper, TreeNode root) {// 左、右、中
if(root == null){
return true;
}
if(root.val <= lower || root.val >= upper){
return false;
}
// 下面对应了两种情况:三个结点都是左子结点 和 三个结点都是右子结点
return validBST(lower, root.val, root.left) && validBST(root.val, upper, root.right);
}
// 简洁实现*中序遍历
private long prev = Long.MIN_VALUE;
public boolean isValidBST3(TreeNode root) {
if(root == null){
return false;
}
if(!isValidBST3(root.left)){//isValidBST3(root.left) 为false 则返回false
return false;
}
if(root.val <= prev){// 不满足二叉搜索树的条件
return false;
}
prev = root.val;
return isValidBST(root.right);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
6.20 验证二叉搜索树——【LeetCode】
最新推荐文章于 2024-07-25 11:15:54 发布