题解 | #判断是不是二叉搜索树#
判断是不是二叉搜索树
https://www.nowcoder.com/practice/a69242b39baf45dea217815c7dedb52b
思路
- 由于二叉排序树中序遍历是一个递增的有序序列,我们直接对传入的树进行中序遍历,如果输出序列不是递增的说明不是二叉排序树
- 也可以准备一个全局变量,记录遍历时的上一个节点的值,用当前值与上一个值的比较来取代原来加入当前节点值的逻辑,这样也可以
代码
思路一代码:
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) {
if (root == null) {
return true;
}
// 创建一个数组接收中序遍历结果
ArrayList<Integer> result = new ArrayList<>();
inorderTraversal(root, result);
for (int i = 0; i < result.size() - 1; i++) {
if (result.get(i) > result.get(i + 1)) {
return false;
}
}
return true;
}
/**
* 判断传入二叉树是否为二叉搜索树
*
* @param root 根节点
* @param result 中序遍历结果储存数组
* @return boolean 判断结果
* @apiNote
* @since 2023/1/2 13:25
*/
public void inorderTraversal(TreeNode root, List<Integer> result) {
if (root != null) {
inorderTraversal(root.left, result);
// 将当前节点值加入集合
result.add(root.val);
inorderTraversal(root.right, result);
}
}
}
思路二代码:
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 {
/**
* 创建一个变量标记上一个节点值
*/
Integer pre = Integer.MIN_VALUE;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param root TreeNode类
* @return bool布尔型
*/
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
return judgment(root);
}
/**
* 判断传入二叉树是否为二叉搜索树
*
* @param root 根节点
* @return boolean 判断结果
* @apiNote
* @since 2023/1/2 13:25
*/
public boolean judgment(TreeNode root) {
if (root.left != null) {
return judgment(root.left);
}
// 将当前节点值加入集合
if (pre >= root.val) {
return false;
} else {
pre = root.val;
}
if (root.right != null) {
return judgment(root.right);
}
return true;
}
}