leetcode 98. 验证二叉搜索树(递归 栈)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree/
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
用例
示例 1:

输入:root = [2,1,3]
输出:true
示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
树中节点数目范围在[1, 104] 内
-231 <= Node.val <= 231 - 1
思路
方法1
中序遍历有序即为有效搜索二叉树
我写的非递归迭代版本 注意用例最小值为INT_MIN 所以设定最小值需要设为LONG_MIN(LONG LONG)
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*>s;
long long front=LONG_MIN;// 记录序列最小值
while(root!=nullptr||!s.empty())
{
while(root!=nullptr)
{
s.push(root);
root=root->left;
}
root=s.top();
s.pop();
if(root->val<=front)
{
return false;
}else
{
front=root->val;
}
root=root->right;
}
return true;
}
};
方法2
递归,递归条件给一个最大范围和最小范围 ,左侧递归更新最小范围 右侧递归更新最大范围
class Solution {
public:
bool isValidBST(TreeNode* root) {
return dfs(root,LONG_MIN,LONG_MAX);
}
bool dfs(TreeNode* root,long long lower,long long upper)
{
if(root==nullptr)
return true;
if(root->val<=lower||root->val>=upper)
return false;
return dfs(root->left,lower,root->val)&&dfs(root->right,root->val,upper);
}
};

浙公网安备 33010602011771号