思路1 左子树得节点都比父节点小,右子树节点都比父节点大
bool isValidBST(TreeNode *root) {
return checkValid(root,INT_MIN,INT_MAX);
}
bool checkValid(TreeNode* root,int low,int high){
if(root==NULL)
return true;
if(root->val<=low||root->val>=high)
return false;
return checkValid(root->left,low,root->val)&&checkValid(root->right,root->val,high);
}
思路2 : 用中序遍历,
递归: 用一个指针保留前一个结点的值
TreeNode* pre=NULL;
bool isBST=true;
public:
bool isValidBST(TreeNode *root) {
Inorder(root);
return isBST;
}
void Inorder(TreeNode* root){
if(root==NULL)
return;
Inorder(root->left);
if(pre&&pre->val >= root->val)
isBST = false;
pre=root;
Inorder(root->right);
}
中序遍历
非递归
bool isValidBST(TreeNode *root) {
if(root==NULL)
return true;
TreeNode* pre=NULL;
stack<TreeNode*> treeStack;
while(!treeStack.empty()||root!=NULL){
while(root){
treeStack.push(root);
root=root->left;
}
if(!treeStack.empty()){
root=treeStack.top();
treeStack.pop();
if(pre&&pre->val >= root->val)
return false;
pre=root;
root=root->right;
}
}
return true;
}