题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析:
后序遍历的最后一个值为二叉树的根节点值,判断是否为二叉搜索树,递归判断是否左子树节点都小于根,右子树节点都大于根。
因此,可以先从序列中找到比根小的值,判定为左子树,后续的值应该为右子树,如果比根大,直接返回false。
实现:
public boolean VerifySquenceOfBST(int[] sequence) {
int len = sequence.length;
if (sequence == null || len == 0)
return false;
int root = sequence[len - 1];
// 找到左子树与右子树的分界
int i = 0;
for (; i < len - 1; i++) {
if (sequence[i] > root) {
break;
}
}
// 右子树中有比根小的值,返回false
int j = i;
for (; j < len - 1; j++) {
if (sequence[j] < root)
return false;
}
// 递归遍历左右子树序列
boolean left = true;
boolean right = true;
if (i > 0) {
left = VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
}
if (i < len - 1)
right = VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, len - 1));
return (left && right);
}