1 题目描述
2 算法思路
思路:
- 后序遍历序列本质上就是: 左 、 右 、 根节点
- 那后序遍历序列的倒序,就是:根节点、右、左
- 那么利用后序遍历序列倒序这个特点,我们可以利用一个单调栈来进行判断。
判断的思路大致如下,后序遍历倒序 [ 5 ,6 ,2, 3, 1]
- 由于倒序序列的第一个节点肯定为根节点5,后面遇见递增的节点,就说明是右子树,那么就加入单调栈
- 当遇见递减的 ,即 2 ,就需要进行判断
- 首先2肯定是左子树的,因此需要找到2的根节点,依次弹出单调栈 6 和 5 ,找到2 的父节点5,条件满足(栈空) ,2 就加入单调栈
- 此时更新根节点root = 5
- 然后继续遍历,3也是递增的,3 > 2 加入单调栈
算法流程:
- 初始化单调栈stack ,父节点为root = 正无穷 ,将整个树看作root的左子树
- 倒序遍历序列
- 判断,当前节点 > root, 因为此时应该都是左子树,应该都小于root,因此返回false
- 更新root,当栈不为空,且 当前节点 < stack.peek(),循环弹出栈,并将值赋给root
- 将当前节点入栈
3 代码
class Solution {
public boolean verifyPostorder(int[] postorder) {
Stack<Integer> stack = new Stack<>();
int root = Integer.MAX_VALUE;
for(int i = postorder.length - 1; i >=0 ;i--){
if(postorder[i] > root)
return false;
while(!stack.isEmpty() && stack.peek() > postorder[i]){ //出现递减
root = stack.pop();
}
stack.add(postorder[i]);
}
return true;
}
}
4 提交结果