二叉搜索树的主要特征就是:中序遍历元素有序。
两种思路:
- 将整个树中序遍历一遍,把所有元素都储存下来,然后再线性扫一遍这个数组,看是否满足有序条件。TC:O(n),MC:O(n)。
- 想办法优化空间损耗,那就是边中序遍历边判断,中序遍历时每个元素都会比在中序遍历中前一个元素要大。于是,设一个pre全局变量,储存前一个元素,数据会卡int最小值,所以初始化的时候设个long的最小值LONG_MIN。
法2:
long pre = LONG_MIN;
bool isValidBST(TreeNode* root){
if(!root) return true;
//如果左子树都不满足了,就直接返回了 没必要判断根 和右子树了
if(!isValidBST(root->left)) return false;
if(root->val <= pre) return false;
pre = root->val;
return isValidBST(root->right);
}
法1:
vector<int> InorderTraversal;
bool isValidBST(TreeNode* root) {
if(!root) return true;
dfs(root);
for(int i = 1;i < InorderTraversal.size();++i){
if(InorderTraversal[i] <= InorderTraversal[i-1])
return false;
}
return true;
}
void dfs(TreeNode* root){
if(!root) return;
dfs(root->left);
InorderTraversal.push_back(root->val);
dfs(root->right);
}