Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
Example 1:
Input: 2 / \ 1 3 Output: true
Example 2:
5 / \ 1 4 / \ 3 6 Output: false Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value is 5 but its right child's value is 4.
/**
* Definition for a binary tree node.* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(root==NULL){
return true;
}
if(root->left==NULL&&root->right==NULL){
return true;
}
TreeNode *cur=root,*pre=NULL;
stack<TreeNode *> st; // 中序遍历
while(!st.empty()||cur){
while(cur){
st.push(cur);
cur=cur->left;
}
if(!st.empty()){
cur=st.top();
st.pop();
// ivec.push_back(cur->val)
if(pre==NULL){
pre=cur;
}else{
if(cur->val<=pre->val){
return false;
}else{
pre=cur;
}
}
cur=cur->right;
}
}
return true;
// return helper1(root,INT_MIN+1,INT_MAX-1);
}
bool helper1(TreeNode *root,int low,int upper){
if(root==NULL){
return true;
}
if(root->val<=low||root->val>=upper){// 二查搜索数 不能有等于
return false;
}
return helper(root->left,low,root->val)&&helper(root->right,root->val,upper);
}
// 目标找出一个对应的 low 和 upper 与 root->val进行比较
bool helper(TreeNode *root,int low,int upper){
if(root==NULL){
return true;
}
if(root->val>=upper||root->val<=low){
return false;
}
// 往左走 最大值就会变化 往右走 最小值就会变化
return helper(root->left,low,root->val)&&helper(root->right,root->val,upper);
}
};