题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
示例
输入:
2
/ \
1 3
输出: true
思路1-递归
按照题意,此题是严格bst,即左子树严格小于根节点,右子树严格大于右结点。
如果根结点为x,其取值范围为[INT_MIN,INT_MAX],则其左子树肯定在[INT_MIN, x-1]之间,右子树在[x+1, INT_MAX]之间,所以更改判断当前取值范围即可判断是否为bst。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
return isBST(root, INT_MIN, INT_MAX);
}
bool isBST(TreeNode* root, long long minv, long long maxv){
if (!root) return true;
int val = root->val;
if (val > maxv || val < minv) return false;
return (isBST(root->left, minv, val-1ll) && isBST(root->right, val+1ll, maxv));
}
};
思路2-迭代
中序遍历。注意前一个结点的的边界条件。因为结点值可能为INT_MIN。
代码
class Solution {
public:
bool isValidBST(TreeNode* root) {
if (!root) return true;
stack<TreeNode*> s;
long last = LONG_MIN;
while (root || !s.empty()){
while (root){
s.emplace(root);
root = root->left;
}
if (!s.empty()){
TreeNode* cur = s.top();
s.pop();
if (cur->val <= last) return false;
last = cur->val;
root = cur->right;
}
}
return true;
}
};