题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
解题思路
这题比较难, 审题可知后序遍历结果就是先读左节点再度右节点最后读取根节点,所以这里最后的一个数字就是根节点, 难点1: 如何设置递归函数的参数, 我们首先坑定是返回布尔类型的递归函数, 我们然后返回的肯定是递归左子树和递归右子树的布尔类型逻辑与关系,然后参数的,因为涉及到左子树和右子树,我们坑定要先区分左子树范围是哪里到哪里, 那么这里就用原数组和两个下标确定范围, 难点2: 退出递归函数的逻辑是范围大小小于等于1, 那么这个树结构肯定是可以成立的,返回true, 然后就是寻找左子树的末尾去区分左右子树,还有就是关键一点右子树的所有数值是否满足都大于根节点的数值,如果没有这一条判断是跑步成功的,下面就是代码实现。
Java代码实现
public class VerifyPostorder {
public boolean verifyPostorder(int[] postorder) {
return recur(postorder, 0, postorder.length - 1) ;
}
private boolean recur(int[] postorder, int startIndex, int endIndex) {
if(startIndex >= endIndex){
return true;
}
int root = postorder[endIndex];
int i = startIndex;
while(postorder[i] < root){
i ++;
}
int middleIndex= i;
while(postorder[i] > root){
i ++;
}
return endIndex == i && recur(postorder, startIndex, middleIndex - 1) && recur(postorder, middleIndex, endIndex - 1);
}
}