输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
方法一 递归
判断从i到j范围上是否满足左孩子节点小于根 右孩子节点大于根
递归左子树和右子树
方法二 单调栈
将后序遍历倒过来即为中右左的顺序
单调递增栈用来维护右孩子节点
若当前元素小于栈顶元素
栈顶元素出栈并作为当前相对根节点
则之后的元素应作为该相对节点的左孩子
若大于当前相对根节点 则不满足条件
class Solution {
public boolean verifyPostorder(int[] postorder) {
// if(postorder == null || postorder.length == 0)
// return true;
// return recur(postorder, 0, postorder.length - 1);
// }
// //数组在i-j上是否满足根的条件
// private boolean recur(int[] arr, int i, int j){
// if(i >= j)
// return true;
// int p = i;
// while(p <= j && arr[p] < arr[j])
// p++;
// int m = p;
// while(p <= j && arr[p] > arr[j])
// p++;
// return p == j && recur(arr, i, m - 1) && recur(arr, m, j - 1);
//单调栈
int root = Integer.MAX_VALUE;
Stack<Integer> stack = new Stack<>();
for(int i = postorder.length - 1; i >= 0; i--){
if(postorder[i] > root)
return false;
while(!stack.isEmpty() && postorder[i] < stack.peek()){
root = stack.pop();
}
stack.push(postorder[i]);
}
return true;
}
}