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