题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
首先,我们需要知道二叉搜索树的特点,即所有左子树的节点值都小于根节点的值,所有右子树的节点值都大于根节点,并且左右子树也满足这一特点。
而后序遍历有一个特点,就是,先遍历左子树,再遍历右子树,最后遍历根节点,并且数组中最后一个元素的值就是根节点,知道了这两点,这道题很容易就可以解出来了。
具体来说就是,定义一个start引用指向数组的第一个元素,last引用指向数组的最后一个元素。
根据指定序列找到根节点的位置,用 i 来标记。由于右子树的节点值都大于根节点,所以如果 i-1 位置的元素大于last位置的元素,i–,直到不满足这一条件,那么从 i 到 last-1 之间的元素就是右子树的节点。
而左子树的节点值又都比根节点小,所以定义一个变量 j ,它标记此时 i 的前一个位置,遍历从 start 到 j-1 的所有元素(左子树的节点),如果大于 last 标记的值,说明这不是二叉搜索树的后序遍历 。
最后再分别递归遍历左右子树,判断它们是否也满足上述条件,递归结束的条件就是,start >= last ,说明全部符合条件,是二叉搜索树的后序遍历序列。
看代码:
public class isSearchTreeHouXu {
public boolean VerifySquenceOfBST(int[] sequence) {
if (sequence.length == 0) {
return false;
}
return judge(sequence, 0, sequence.length - 1);
}
private static boolean judge(int[] array, int start, int last) {
if (start >= last) {
return true;
}
int i = last;
//右子树
while (i > start && array[i - 1] > array[last]) {
i--;
}
//左子树
for (int j = i - 1; j >= start; j--) {
if (array[j] > array[last]) {
return false;
}
}
return judge(array, start, i - 1) && judge(array, i, last - 1);
}
}