二叉搜索树的后序遍历序列
原创
©著作权归作者所有:来自51CTO博客作者龙崎流河的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
示例 1:
输入: [1,6,3,2,5] 输出: false
示例 2:
输入: [1,3,2,6,5] 输出: true
提示:
数组长度 <= 1000
分析
根据二叉搜索树节点左子树的值都比该节点的值小,该节点右子树的值都比该节点的值大。
由于上面的规则,右子树的所有值应该都大于根节点的值5,其中右子树中的3,2都小于5所以不符合要求。
下图是符合二叉搜索树要求的例子,左子树中的判断和之前的判断相同,所以采用递归方式。
代码
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);
}
}