持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
本文已参与[新人创作礼]活动,一起开启掘金创作之路
题目
98. 验证二叉搜索树
难度中等1598
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: root = [2,1,3]
输出: true
示例 2:
输入: root = [5,1,4,null,null,3,6]
输出: false
解释: 根节点的值是 5 ,但是右子节点的值是 4 。
提示:
- 树中节点数目范围在
[1, 104]内 -231 <= Node.val <= 231 - 1
思路一
1.中序遍历
2.构建一个数组其值按从小到大来
代码
class Solution {
public:
vector<int> ret;
void reversal(TreeNode*root) {
if (root->left) reversal(root->left); //左
ret.push_back(root->val); //中
if (root->right) reversal(root->right);//右
}
bool isValidBST(TreeNode* root) {
reversal(root);
for (int i = 1; i < ret.size(); i++) {
if (ret[i - 1] >= ret[i] ) return false;
}return true;
}
};
思路二
中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 二叉搜索树,继续遍历;否则直接返回 false。
代码
class Solution {
public:
long long pre = (long long)INT_MIN - 1; //注意此处
bool isValidBST(TreeNode* root) {
if (root == nullptr) return true;
if (!isValidBST(root->left)) return false;//左
if (pre >= root->val) return false; //不符合条件返回false
pre = root->val;
if (!isValidBST(root->right)) return false;//右
return true;
}
};
注意代码中使用的是long long pre = (long long)INT_MIN - 1,而不是 long long pre = INT_MIN - 1.
原因: 这样的书写是错误的,只是保证了pre是longlong范围, 但是INT_MIN - 1已经超出了int的范围,所以前面需要加(long long)。
-2147483648到2147483647
(INT_MIN ~INT_MAX)
(-INT_MAX - 1~ INT_MAX)