// class Solution {
// public:
// bool isValidBST(TreeNode* root) {
// //不止每个子树的根节点要>左结点,<右结点,而是每个根节点要>左子树的所有节点,<右子树的所有节点
// // 所以以下代码错误
// // if(root==NULL) return true;
// // if(root->left!=NULL&&root->val<=root->left->val) return false;
// // else if(root->right!=NULL&&root->val>=root->right->val) return false;
// // return isValidBST(root->left)&&isValidBST(root->right);
// //二叉搜索树在中序遍历下是一个递增数组
//生成中序序列数组,并验证其是否是递增数组
// vector<int> res=inorder(root);
// for(int i=0;i<res.size()-1;i++){
// if(res[i+1]<=res[i]) return false;
// }
// return true;
// }
// vector<int> inorder(TreeNode *root){
// vector<int> res;
// traversal(root,res);
// return res;
// }
// void traversal(TreeNode *root,vector<int> &res){
// if(root==NULL) return ;
// if(root->left!=NULL) traversal(root->left,res);
// res.push_back(root->val);
// if(root->right!=NULL) traversal(root->right,res);
// }
// };
class Solution {
public:
//因为二叉搜索树的整个左子树都要比根节点小,整个右子树都要比根节点大,所以记录下左子树中的最大值,加一项根节点与左子树的最大值的比较
//因为中序遍历的顺序是左根右,是按照递增顺序排列的,所以上一个节点是当前所有节点中的最大结点
//其实思路就是不生成数组,但总比较上一个结点与当前结点的大小,其实质就是看中序序列是否是递增序列
TreeNode *pre=NULL;
bool isValidBST(TreeNode* root) {
if(root==NULL) return true;
bool left=isValidBST(root->left);
if(pre!=NULL&&pre->val>=root->val) return false;
pre=root;
bool right=isValidBST(root->right);
return left&&right;
}
};
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = NULL; // 记录前一个节点
while (cur != NULL || !st.empty()) {
if (cur != NULL) {
st.push(cur);
cur = cur->left; // 左
} else {
cur = st.top(); // 中
st.pop();
if (pre != NULL && cur->val <= pre->val) return false;
pre = cur; //保存前一个访问的结点
cur = cur->right; // 右
}
}
return true;
}
};