题目描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树
只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
代码
使用中序遍历是有序的特性
class Solution {
public:
void reversal(TreeNode* node, vector<int>& vec) {
if (node == nullptr) return;
reversal(node->left, vec);
vec.push_back(node->val);
reversal(node->right, vec);
}
bool isValidBST(TreeNode* root) {
if (root == nullptr) return true;
vector<int> res;
reversal(root, res);
for (int i = 1; i < res.size(); i++)
if (res[i - 1] >= res[i]) return false;
return true;
}
};
不开辟额外的空间
class Solution {
public:
TreeNode* pre=nullptr; //用来记录前一个节点
bool isValidBST(TreeNode* root) {
if (root == nullptr) return true;
bool left = isValidBST(root->left);
if (pre != nullptr && pre->val >= root->val)
return false;
pre = root;
bool right = isValidBST(root->right);
return left && right;
}
};