class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
if(postorder.empty()) return true;
return verify(postorder,0,postorder.size()-1);
}
bool verify(vector<int>& postorder,int begin,int end){
if(begin>=end) return true;
int root = postorder[end];
int i=begin;
for(;i<end;i++){
if(postorder[i]>root)
{
break;
}
}//从左到右找到第一个比root大的,就是右子树开始的起点
int j=i;
for(;j<end;j++)
{
if(postorder[j]<root)
return false;
}
return verify(postorder,begin,i-1) && verify(postorder,i,end-1);
}
};
刚看到题目以为要一个序列和树进行dfs遍历对比,但是发现输入参数只有一个数组,那么就是重建树的过程,如果左子树都比根小,并且右子树都比根大,那就是合格的。根据后续遍历,我们知道数组的最后一个元素是根,所以先从头遍历到根,找到第一个比根大的数,那个下标,记作i,从begin到i-1就是左子树,从i到end-1就是右子树,先判断i到end-1中是否有比根小的数,是则返回false,否则需要递归遍历左子树和右子树来判断。