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

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

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

    5
   / \
  2   6
 / \
1   3

示例 1:

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

示例 2:

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

提示:

  1. 数组长度 <= 1000

递归

二叉搜索树的,中序遍历 左 根 右 是升序的,也就是左比根小,右比根大。

后续遍历结合二叉树的特点就是 最后一个是根,根的前面,一部分连续小于根,后面一部分连续大于根。

满足条件,再递归判断左右子树,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
   class Solution {
public boolean verifyPostorder(int[] postorder) {
return recur(postorder,0,postorder.length-1);
}

//当前这颗树,开始和结束的点
public boolean recur(int[] postorder,int start ,int end ){

//后续遍历,最后一个就是根
if (start >= end) {
return true;
}

//有连续的一部分小于根, 找到小于的界限
int cur = start;
while (postorder[cur] < postorder[end]) cur++;

//左子树的界限
int left = cur-1;

//从界限开始,有连续的一部分大于根
while (postorder[cur]>postorder[end]) cur++;

//刚好遇到根 && 左子树 && 右子树(右子树当然要去掉根)
return cur == end && recur(postorder, start, left)
&& recur(postorder,left+1, end-1);
}
}