题目

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

参考以下这颗二叉搜索树:

二叉搜索树的后序遍历序列_数组


示例 1:

​输入: [1,6,3,2,5] 输出: false​​ 示例 2:

​输入: [1,3,2,6,5] 输出: true​

提示:

数组长度 <= 1000

分析

根据二叉搜索树节点左子树的值都比该节点的值小,该节点右子树的值都比该节点的值大。

由于上面的规则,右子树的所有值应该都大于根节点的值5,其中右子树中的3,2都小于5所以不符合要求。

二叉搜索树的后序遍历序列_子树_02

下图是符合二叉搜索树要求的例子,左子树中的判断和之前的判断相同,所以采用递归方式。

二叉搜索树的后序遍历序列_数组_03

代码

class Solution {
public boolean verifyPostorder(int[] postorder) {
if(postorder == null){
return true;
}
return f(postorder,0,postorder.length-1);
}
boolean f(int[] postorder,int i,int j){
if(i>=j) return true;
int root = postorder[j];
int p = i;
//先确定p的位置
while(root > postorder[p]) p++;
for(int k=p;k<j;k++){
if(postorder[k] < root){
return false;
}
}
return f(postorder,i,p-1)&&f(postorder,p,j-1);
}
}

二叉搜索树的后序遍历序列_二叉搜索树_04