最后访问的一定是根节点,所以扫描数组找 出第一个大于根节点的位置记作m,则 [i,m-1] 的值都是小于根节点的数,即为左子树;[m,j-1]为右子树,判断[m,j-1]的值是否都大于根节点:依据是p==j,即扫描到数组尾。再递归判断左子树和右子树是否为二叉树。
class Solution {
public:
bool ispost(int i,int j,vector<int>&postorder){
if(i>=j) return true;
int p=i;
while(postorder[p]<postorder[j]) p++;
int m=p;
while(postorder[p]>postorder[j]) p++;
return p==j&&ispost(i,m-1,postorder)&&ispost(m,j-1,postorder);
}
bool verifyPostorder(vector<int>& postorder) {
return ispost(0,postorder.size()-1,postorder);
}
};