根据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;
    }
};