//输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
//
//
//
// 参考以下这颗二叉搜索树:
//
// 5
// / \
// 2 6
// / \
// 1 3
//
// 示例 1:
//
// 输入: [1,6,3,2,5]
//输出: false
//
// 示例 2:
//
// 输入: [1,3,2,6,5]
//输出: true
//
//
//
// 提示:
//
//
// 数组长度 <= 1000
//
// 👍 209 👎 0
class Solution {
public boolean verifyPostorder(int[] postorder) {
if (postorder == null) {
return false;
}
return doCheck(postorder, 0, postorder.length - 1);
}
private boolean doCheck(int[] postOrder, int start, int end) {
if (start >= end) {
return true;
}
int rootVal = postOrder[end];
// leftEnd实际为右子树开始位置
int leftEnd = start;
for (; postOrder[leftEnd] < rootVal && leftEnd < end;) {
if (postOrder[leftEnd] < rootVal) {
leftEnd++;
}
}
// 右子树
for (int i = leftEnd; i < end; i++) {
if (postOrder[i] <= rootVal) {
return false;
}
}
return doCheck(postOrder, start, leftEnd - 1)
&& doCheck(postOrder, leftEnd, end - 1);
}
}