剑指No.33_二叉搜索树的后序遍历序列
- 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例:
输入: [1,6,3,2,5]
输出: false
输入: [1,3,2,6,5]
输出: true
- 递归方法
分治思想,后序遍历的序列格式为[左子节点|右子节点|根节点]
二叉搜索树的左子节点比根节点小,右子节点比根节点大
于是原始数组的最后一个元素就是根节点的值,前面开始比根节点小的就是它的左子节点,第一个比根节点大的开始后面的就应该是它的右子节点,于是问题就可以变为右子节点中有没有比根节点小的,如果有就为false,没有就是true。最后递归对每个左子树右子树处理。连接
public boolean verifyPostorderWay(int[] postorder){
return recur(postorder, 0, postorder.length - 1);
}
public 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);
}