
class Solution{
public:
// 验证二叉搜索树 整体思路:中序遍历取到的root->val一定是递增的,循环中上一次的root->val就保存为min,和这次的val对比。一开始最小的最左下节点的val和LONG_MIN比,此后min从LONG_MIN更新为每次遍历取到的val
bool isValidBST(TreeNode *root){
// 记录当前的最小值
long min=LONG_MIN;
// 用栈来缓存进行中序遍历
stack<TreeNode *> temp;
// 如果栈不空或二叉搜索树没有遍历完毕
// 就继续循环
while(!temp.empty()||root!=nullptr){
// 如果没有遍历到叶子结点
while(root!=nullptr){
// 将当前节点入栈
temp.push(root);
// 在遍历到叶子结点之前持续遍历左子树
root=root->left;
}
// 将栈顶节点出栈
root=temp.top();
// 弹出栈顶节点
temp.pop();
// 如果根节点的值小于左子树的最大值
if(root->val<=min){
// 表明不满足二叉搜索树节点大小的性质
return false;
}
// 如果满足性质,更新左子树的最大值
min=root->val;
// 在遍历完左子树和根节点之后
// 转向遍历遍历右子树
root=root->right;
}
return true;
}
};