![a920151dd2d8b3179a656d373a2a7ca2.png](https://i-blog.csdnimg.cn/blog_migrate/4d0b3a5a82310559c6e9b890e8d585f4.png)
1、想法
遍历的时候,如果遇到比最后一个元素大的节点,就说明它的前面都比最后一个元素小,该元素后面的所有值都必须大于最后一个值,这两个条件必须都要满足。否则就说明该序列不是二叉树后序遍历。
例子: 2 4 3 6 8 7 5 这是一个正确的后序遍历
这个例子的特点就是:最后一个元素是 5 ,首先遍历数组,当遍历到6的时候,6前面的值都小于5,如果在6后面的值有一个小于5就不是后序遍历,所以一旦在遍历的时候遇到比最后一个元素的值索引,那么之后的所有元素都必须大于5,否则就不是后序遍历序列。
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size()==0)
return false;
int len=sequence.size()-1;
//int count=0;
for(int i=len;i>=0;i--){
int j=0;
while(sequence[j]<sequence[i]) //2 4 3 6 9 8 5,连续的,如果前面大于个数加上
j++;
while(sequence[j]>sequence[i])
j++;
if(j<i) //看了一上午都没有发现这个错误if(j<len)
return false;
}
return true;
}
};
![b1e5dd8e821dabfb48dacfd9c24a7608.png](https://i-blog.csdnimg.cn/blog_migrate/849c17ffaf7220cadc4ffe18f6b5afc4.png)
2、左右子数遍历,递归,其实判断思想和上面一样???
class Solution {
public:
bool VerifyBST(const vector<int>& sequence,const int first,const int last) {
if(sequence.size()<=0) //if(sequence.size()<=0 ||last<=0)不对,后面的或不应该要
return false;
if(first>=last)
return true;
//int len=sequence.size()-1; //last=len=sequence.size()-1
int j=0,partition;
while(sequence[j]<sequence[last])
j++;
partition=j; //4 8 6 12 16 14 10 j最后多加了1,在12位置上
while(sequence[j]>sequence[last])
j++;
if(j<last)
return false;
return VerifyBST(sequence,first,partition-1) && VerifyBST(sequence,partition,last-1);
}
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size()<=0)
return false;
return VerifyBST(sequence,0, sequence.size()-1);
}
};
![fd2722dededc135bc5c00cce574ff12f.png](https://i-blog.csdnimg.cn/blog_migrate/aee654e02e5443f502a05297c9be0ef6.png)