题目:输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历序列。假设数组的任意两个数字都不相同。
解题思路:这里是二叉搜索树,其左子树应该都小于根节点,右子树则都大于根节点。在后续遍历序列中,最后一个数字是根节点,我们根据最后一个数字可以把数组剩余部分按顺序分成两块,小于该数字的以及剩下的。小于该数字的是其左子树的后序遍历序列,另一部分应该是其右子树的后序遍历序列。然后判断这剩余部分也就是右子树是否满足均大于根节点。
public static boolean verifySequenceOfBST(int[] sequence) {
int len = sequence.length;
if (sequence == null || len <= 0)
return false;
if (len == 1)
return true;
return judge(sequence, 0, len - 1);
}
private static boolean judge(int[] sequence, int start, int root) {
if (start == root)
return true;
// 根节点的值
int rootValue = sequence[root];
// 找到左右子树的分界
int i = start;
for (; i < root; i++) {
if (sequence[i] > rootValue)
break;
}
// 判断右子树范围是否都满足都大于root的要求
for (int j = i; j < root; j++) {
if (sequence[j] < rootValue)
return false;
}
// 递归判断左右子树
return judge(sequence, start, i - 1) && judge(sequence, i, root - 1);
}
测试代码和结果:
public static void main(String[] args) {
//验证 正确序列、错误序列、空序列、单个数据序列
int[] a1 = { 5, 7, 6, 9, 11, 10, 8 };
int[] a2 = { 7, 4, 6, 5 };
System.out.println(Problem33.verifySequenceOfBST(a1) + "\n" + Problem33.verifySequenceOfBST(a2));
System.out.println(Problem33.verifySequenceOfBST(new int[]{}));
System.out.println(Problem33.verifySequenceOfBST(new int[]{2}));
}
true
false
false
true