package questions;
/**
* @title 判断整数序列是不是二元查找树的后序遍历结果
* @question 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。<br>
* 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:<br>
* ....8<br>
* .../ \<br>
* ..6 . 10<br>
* ./\ . /\<br>
* 5 7 . 9 11<br>
* 因此返回true。<br>
* 如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。<br>
* @analysis 分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。<br>
* 在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于左半部分;
* 从第一个大于根结点开始到根结点前面的一个元素为止
* ,所有元素都应该大于根结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分
* ,我们递归的确认序列的左、右两部分是不是都是二元查找树。
* @author Sam
*
*/
public class Ex1o2o8 {
public static void main(String[] args) {
int[] sequence = { 5, 7, 6, 9, 11, 10, 8 };
System.out.println(sequenceOfBST(sequence, 0, sequence.length));
sequence = new int[] { 7, 4, 6, 5 };
System.out.println(sequenceOfBST(sequence, 0, sequence.length));
}
private static boolean sequenceOfBST(int[] sequence, int start, int end) {
if (null == sequence || end - start <= 0) {
return false;
}
int root = sequence[end - 1];//获取根结点
int index = start;
for (int i = start; i < end - 1; i++) {//找到左右子树分界结点的下标
if (sequence[i] > root) {
index = i;
break;
}
}
for (int i = index; i < end - 1; i++) {//验证后面的必须都大于root
if (sequence[i] < root) {
return false;
}
}
boolean left = true;
if (index > start) {
left = sequenceOfBST(sequence, start, index);
}
boolean right = true;
if (index < end - 1) {
right = sequenceOfBST(sequence, index, end - 1);
}
return left && right;
}
}
数据结构面试题1.2.8-判断整数序列是不是二元查找树的后序遍历结果
最新推荐文章于 2017-05-23 22:42:00 发布