一、递归
(1)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// 递归
bool BST_left(TreeNode* root, int val){
if(!root) return true;
if(root->val >= val) return false;
if(root->left && root->left->val >= root->val) return false;
if(root->right && root->right->val <= root->val) return false;
return BST_left(root->left, root->val) && BST_mid(root->right, root->val, val);
}
bool BST_right(TreeNode* root, int val){
if(!root) return true;
if(root->val <= val) return false;
if(root->left && root->left->val >= root->val) return false;
if(root->right && root->right->val <= root->val) return false;
return BST_mid(root->left, val, root->val) && BST_right(root->right, root->val);
}
bool BST_mid(TreeNode* root, int val_1, int val_2){
if(!root) return true;
if(root->val <= val_1 || root->val >= val_2) return false;
if(root->left && root->left->val >= root->val) return false;
if(root->right && root->right->val <= root->val) return false;
return BST_mid(root->left, val_1, root->val) && BST_mid(root->right, root->val, val_2);
}
bool isValidBST(TreeNode* root) {
if(!root) return true;
return BST_left(root->left, root->val) && BST_right(root->right, root->val);
}
};
(2)一种函数
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// 递归
bool BST_mid(TreeNode* root, long val_1, long val_2){
if(!root) return true;
if(root->val <= val_1 || root->val >= val_2) return false;
if(root->left && root->left->val >= root->val) return false;
if(root->right && root->right->val <= root->val) return false;
return BST_mid(root->left, val_1, root->val) && BST_mid(root->right, root->val, val_2);
}
bool isValidBST(TreeNode* root) {
if(!root) return true;
return BST_mid(root->left, LONG_MIN, root->val) && BST_mid(root->right, root->val, LONG_MAX);
}
};
(3)中序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
long Maxval = LONG_MIN;
// 递归
bool isValidBST(TreeNode* root) {
if(!root) return true;
bool left = isValidBST(root->left);
if(Maxval < root->val)
Maxval = root->val;
else
return false;
bool right = isValidBST(root->right);
return left && right;
}
};
二、迭代
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
long Maxval = LONG_MIN;
// 迭代
bool isValidBST(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* p = root;
while(p || !st.empty()){
while(p){
st.push(p);
p = p->left;
}
p = st.top();
st.pop();
if(Maxval < p->val)
Maxval = p->val;
else
return false;
p = p->right;
}
return true;
}
};