题面
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例1:
输入:
2
/ \
1 3
输出: true
实例2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
题目分析
记录一下-_-一开始自己想的简单了
AC代码
中序遍历非迭代版本
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> stk;
long long before = -2147483649;
while(!stk.empty() || root != nullptr) {
if(root) {
stk.push(root);
root = root->left;
}
else {
root = stk.top();
stk.pop();
if(root->val <= before)
return false;
else
before = root->val;
root = root->right;
}
}
return true;
}
};
中序遍历递归版本(双高版本)
class Solution {
public:
vector<int> ans;
vector<int> inorderTraversal(TreeNode* root) {
if(root) {
inorderTraversal(root->left);
ans.push_back(root->val);
inorderTraversal(root->right);
}
return ans;
}
bool isValidBST(TreeNode* root) {
if(!root)
return true;
inorderTraversal(root);
for(int i = 0; i < ans.size() - 1; i++) {
if(ans[i] >= ans[i+1])
return false;
}
return true;
}
};
中序遍历递归改良版
class Solution {
public:
bool check(TreeNode* root, long long minn, long long maxx) {
if(!root)
return true;
if(root->val >= maxx || root->val <= minn)
return false;
return check(root->left, minn, root->val) && check(root->right, root->val, maxx);
}
bool isValidBST(TreeNode* root) {
return check(root, LONG_MIN, LONG_MAX);
}
};
本人水平有限,如有任何错误,恳请大家指正,不要误导他人…
错误反馈: 1004183196@qq.com