解题思路:若是二叉搜索树中序遍历一定是递增的,否则便不是二叉搜索树,所以可以先中序遍历二叉树的节点,将值保存集合里,然后在判断集合是不是生序的即可,时间复杂度O(N),空间复杂度O(N)
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
public boolean isValidBST (TreeNode root) {
// write code here
ArrayList<Integer> list = new ArrayList<>();
//中序遍历,若是二叉搜索树一定升序
addToList(root, list);
for (int i = 0; i < list.size() - 1; i++) {
if (list.get(i) >= list.get(i + 1)) {
return false;
}
}
return true;
}
private void addToList(TreeNode root, ArrayList<Integer> list) {
if (root == null) {
return ;
}
addToList(root.left, list);
list.add(root.val);
addToList(root.right, list);
}
}
解法二:也可以用一个临时变量来保存上一个节点的值,用一个临时变量flag表示是否出现不符合情况的值。时间复杂度O(N),空间复杂度O(1)。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
private boolean flag = true;
private int pre = Integer.MIN_VALUE;
public boolean isValidBST (TreeNode root) {
// write code here
isValidBST2(root);
return flag;
}
private void isValidBST2(TreeNode root) {
if (root == null) {
return ;
}
isValidBST2(root.left);
if (root.val <= pre) {
flag = false;
}
pre = root.val;
isValidBST2(root.right);
}
}
解法三:每个节点都应该满足左孩子的值<当前节点的值<右孩子的值
时间复杂度O(N),空间复杂度O(N),因为最坏情况下二叉树一直左斜或者右斜。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
public boolean isValidBST (TreeNode root) {
// write code here
return isValidBST2(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
//表示当根节点为root的时候,root必须要满足root.val左孩子的值,小于右孩子的值
private boolean isValidBST2(TreeNode root, int left, int right) {
if (root == null) {
return true;
}
if (root.val <= left || root.val >= right) {
return false;
}
return isValidBST2(root.left, left, root.val) &&
isValidBST2(root.right, root.val, right);
}
}