根据BST树的性质求解,时间复杂度O(n^2),空间复杂度O(1)
思路:
后序遍历的最后一个元素必定为根结点值,因此将数组从后向前遍历,依次以当前数组元素为基准结点。遇到比此时基准结点值小的数时,该数所在结点肯定在基准结点左侧,标记该数,遍历至数组第一个数。若在此过程中出现了比基准结点值大的数,按BST树规则,它应在基准结点右侧,与它在基准结点的左侧矛盾,则不是BST树。数组下标前移,以前一个元素为基准结点判断,直至整个数组遍历完成。
C:
#include <stdbool.h>
bool VerifySquenceOfBST(int* sequence, int sequenceLen ) {
// write code here
if(!sequenceLen){//为空即错
return false;
}
for(int i=sequenceLen-1;i>0;i--){//逆序遍历整个数组,将sequence[i]做为当前基准结点值,逐一判断,直到表头
int flag=-1;
for(int j=i-1;j>-1;j--){//查找sequence[i]前比sequence[i]小的数,用flag存储下标
if(sequence[j]<sequence[i]){
flag=j;
break;
}
}//若flag还是为-1则没有找到,说明当前基准结点没有左分支,继续判断下一个
//找到sequence[i]小的数sequence[j]后,继续查找sequence[j]前是否有比sequence[i]大的数
for(int j=flag;j>-1;j--){
if(sequence[j]>sequence[i]){//若有则违背了BST树的规则
return false;
}
}
}
return true;
}
C++:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(!sequence.size()){
return false;
}
for(int i=sequence.size()-1;i>0;i--){
int flag=-1;
for(int j=i-1;j>-1;j--){
if(sequence[j]<sequence[i]){
flag=j;
break;
}
}
for(int j=flag;j>-1;j--){
if(sequence[j]>sequence[i]){
return false;
}
}
}
return true;
}
};

京公网安备 11010502036488号