剑指 Offer 33. 二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回
true
,否则返回false
。假设输入的数组的任意两个数字都互不相同。
示例1
输入: [1,6,3,2,5] 输出: false
示例2
输入: [1,3,2,6,5] 输出: true
数据限制 数组长度 <= 1000
思路
因为后序遍历的特点,序列的最后一个元素一定是当前子树的根节点,那么,我们可以从头往后遍历,找到第一个比最后一个元素大的元素,那么,以这个元素p为分割点,设整个序列的范围是[l, r],那么[l, p - 1]就是该子树的左子树,[p, r - 1]就是该子树的右子树,r为根节点,那么,我们在判断[p, r - 1]的元素是否都大于跟节点,如果有一个元素小于,那么这序列就是错误的,如果没有,那么就将队里分割成两部分,分别递归
时间复杂度:O(n)
空间复杂度:O(n)
代码
class Solution {
int[] postorder;
public boolean verifyPostorder(int[] postorder) {
this.postorder = postorder;
if (postorder.length == 0) return true;
int n = postorder.length;
return su(0, n - 1);
}
public boolean su(int l, int r){
if(l >= r) return true;
int p = l;
while (postorder[p] < postorder[r]) p++;
int m = p;
while (postorder[p] > postorder[r]) p++;
return p != r ? false : su(l, m - 1) && su(m, r - 1);
}
}