2025-03-18 12:34:17 +08:00
|
|
|
|
package tree;
|
2025-03-24 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Collections;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
2025-03-18 12:34:17 +08:00
|
|
|
|
/**
|
|
|
|
|
* 题目: 98. 验证二叉搜索树 (isValidBST)
|
|
|
|
|
* 描述:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
|
|
|
|
|
* 有效 二叉搜索树定义如下:
|
|
|
|
|
* 节点的左子树只包含 小于 当前节点的数。
|
|
|
|
|
* 节点的右子树只包含 大于 当前节点的数。
|
|
|
|
|
* 所有左子树和右子树自身必须也是二叉搜索树。
|
|
|
|
|
|
|
|
|
|
* 链接:https://leetcode.cn/problems/validate-binary-search-tree/
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
public class IsValidBST {
|
2025-03-24 18:58:37 +08:00
|
|
|
|
//递归
|
|
|
|
|
public boolean helper(TreeNode node, long lower, long upper) {
|
|
|
|
|
if (node == null) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (node.val <= lower || node.val >= upper) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return helper(node.left, lower, node.val) && helper(node.right, node.val, upper);
|
|
|
|
|
}
|
|
|
|
|
public boolean isValidBST2(TreeNode root) {
|
|
|
|
|
return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//中序遍历
|
|
|
|
|
public void dfs(TreeNode root,List<Integer>list){
|
|
|
|
|
if(root!=null){
|
|
|
|
|
dfs(root.left,list);
|
|
|
|
|
list.add(root.val);
|
|
|
|
|
dfs(root.right,list);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-18 12:34:17 +08:00
|
|
|
|
public boolean isValidBST(TreeNode root) {
|
2025-03-24 18:58:37 +08:00
|
|
|
|
List<Integer> list = new ArrayList<>();
|
|
|
|
|
dfs(root, list);
|
|
|
|
|
// 检查中序遍历结果是否严格递增
|
|
|
|
|
for (int i = 1; i < list.size(); i++) {
|
|
|
|
|
if (list.get(i) <= list.get(i - 1)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
2025-03-18 12:34:17 +08:00
|
|
|
|
}
|
|
|
|
|
}
|