剑指 Offer.33-二叉搜索树的后序遍历序列
剑指 Offer.33-二叉搜索树的后序遍历序列
题目链接
<剑指 Offer 33. 二叉搜索树的后序遍历序列>
问题描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true
,否则返回 false
。假设输入的数组的任意两个数字都互不相同。
官方解法(递归分治)
根据后续遍历
,二叉搜索树
的特性,根节点的左子树全部小于根节点,右子树全部大于根节点,根据此条件,进行递归判断
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public boolean verifyPostorder(int[] postorder) { return recur(postorder,0,postorder.length-1); } boolean recur(int[] postorder,int i,int j){ if(i>=j) return true; int p = i; while(postorder[p] < postorder[j]) p++; int m = p; while(postorder[p] > postorder[j]) p++; return p == j && recur(postorder,i,m-1) && recur(postorder,m,j-1); } }
|
解法二(单调栈)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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; } }
|