首先,根节点肯定是在最后一个的,从第一个开始遍历的话,先是小于根节点的,然后又遇见大于根节点的,当这两个过程遍历完(小于了又大于)所到达的终点索引肯定是最后一个了(小于部分就是根节点的左子树,大于部分就是根节点的又子树,递归即可),需要两个指针,一个开始位置,一个结束位置。
class Solution {
public boolean verifyPostorder(int[] postorder) {
return process(postorder,0,postorder.length - 1);
}
public boolean process(int[] postorder,int begin,int end){
//如果起始位置大于结束位置,只有一个元素的时候就不用判断了。
if(begin >= end){
return true;
}
//i是用来遍历的
int i = begin;
//小于部分
while(postorder[i] < postorder[end]){
i++;
}
//这个就是中间位置,是小于部分的下一个,也就是大于部分的第一个,这个是用来递归子树要用的
int mid = i;
while(postorder[i] > postorder[end] && i < end){
i++;
}
//最后如果小于部分和大于部分遍历完了的话,i的位置应该是根节点的位置。然后递归它的左子树和右子树。
return i == end && process(postorder,begin,mid-1) && process(postorder,mid,end-1);
}
}