给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树
cpp
//自己写的
class Solution {
public:
void inorderHelper(TreeNode* root, vector<int>& result) {
if (root == nullptr) return;
inorderHelper(root->left, result);
result.push_back(root->val);
inorderHelper(root->right, result);
}
bool isValidBST(TreeNode* root) {
vector<int> res;
inorderHelper(root, res);
for (int i = 1; i < res.size(); i++) {
if (res[i] <= res[i-1]) {
return false;
}
}
return true;
}
};
最直接的想法,按中序遍历排序,如果严格升序,就符合要求,能顺利实现
cpp
//抄的
class Solution {
public:
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX);
}
bool helper(TreeNode* node, long min_val, long max_val) {
if (!node) return true;
if (node->val <= min_val || node->val >= max_val) {
return false;
}
return helper(node->left, min_val, node->val)
&& helper(node->right, node->val, max_val);
}
};
递归做法,需要保证整个左节点树都小于根节点,右节点大于根节点,所以需要传递两个极值作为范围。