98.验证二叉搜索树
一、题目描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
提示:
- 树中节点数目范围在[1, 104] 内
- -2^31 <= Node.val <= 2^31 - 1
二、解题思路
1.递归法Ⅰ
根据二叉搜索树的特性,我们可以知道,二叉搜索树的中序遍历序列是一个递增序列。
所以我们只需要中序遍历这颗二叉树,遍历过程如果当前节点 小于等于 上个节点的 val,则说明不是二叉搜索树。
2.递归法Ⅱ
根据二叉搜索树的特性,
假设 root.val 取值范围为 (a, b),那么 root.left.val 取值范围应该为 (a, root.val),root.right.val 取值范围应该为 (root.val, b)。
根据这两个限制条件去做递归,也可解此题。
三、AC代码
1.递归法Ⅰ
class Solution {
long tmp = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
if (!isValidBST(root.left)) {
return false;
}
if (root.val <= tmp) {
return false;
}
tmp = root.val;
return isValidBST(root.right);
}
}
2.递归法Ⅱ
class Solution {
public boolean isValidBST(TreeNode root) {
return valid(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
boolean valid(TreeNode root, long min, long max) {
if (root == null) {
return true;
}
if (root.val <= min || root.val >= max) {
return false;
}
return valid(root.left, min, root.val) && valid(root.right, root.val, max);
}
}
参考代码随想录:https://programmercarl.com/