题目描述
思路分析
二叉树
两种做法,按照定义模拟或者中序遍历判有序。
第一种:定义模拟。dfs返回一个vector里边三个参数,0位置代表是否合法;1位置为最小值;2位置为最大值。递归求左右子树最大值和最小值,更新当前树的信息,并返回。
第二种方法:中序遍历。这是个结论:二叉树是二叉搜索树等价于该二叉树的中序遍历严格单调增。
代码实现
//1.方法1:定义模拟
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(!root) return true;
return dfs(root)[0];
}
vector<int> dfs(TreeNode* root){
vector<int> ans({1,root->val,root->val});
if(root->left){
auto t=dfs(root->left);
if(!t[0]||t[2]>=root->val) ans[0]=0;
ans[1]=min(ans[1],t[1]);
ans[2]=max(ans[2],t[2]);
}
if(root->right){
auto t=dfs(root->right);
if(!t[0]||t[1]<=root->val) ans[0]=0;
ans[1]=min(ans[1],t[1]);
ans[2]=max(ans[2],t[2]);
}
return ans;
}
};
//方法2:中序遍历
class Solution {
public:
vector<int> inorder;
bool isValidBST(TreeNode* root) {
dfs(root);
for(int i=1;i<inorder.size();i++) if(inorder[i]<=inorder[i-1]) return false;
return true;
}
void dfs(TreeNode* root){
if(root->left)dfs(root->left);
inorder.push_back(root->val);
if(root->right)dfs(root->right);
}
};