1. 题目信息
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 递归中序
- 二叉搜索树的中序(左根右)输出是非降序列(不能相等的话,是升序的)。
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(!root)
return true;
long prev = INT64_MIN;
bool valid = true;
isValid(root, prev, valid);
return valid;
}
void isValid(TreeNode* root, long &prev, bool &valid)
{
if(!valid || !root)
return;
isValid(root->left, prev, valid);
if(valid)
valid = (root->val > prev);
prev = root->val;
isValid(root->right, prev, valid);
}
};
2.2 非递归中序
利用栈递归改循环
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(!root)
return true;
long prev = INT64_MIN;
bool valid = true;
stack<TreeNode*> stk;
TreeNode *cur = root;
while(cur != NULL || !stk.empty())
{
while(cur != NULL)
{
stk.push(cur);
cur = cur->left;
}
cur = stk.top();
stk.pop();
if(cur->val <= prev)
return false;
prev = cur->val;
cur = cur->right;
}
return valid;
}
};