数据结构面试题1.2.8-判断整数序列是不是二元查找树的后序遍历结果
2015-09-19 22:01
253 查看
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; } }
相关文章推荐
- 研磨数据结构与算法-05双端链表与双向链表
- 单层感知器、线性神经网络、几种数据结构算法的学习报告
- 数据结构之链表
- 11991 - Easy Problem from Rujia Liu?(抽象数据结构)
- 【R in action】学习笔记——第二章:数据结构
- 基础数据结构--线性表链式实现
- 基础数据结构--线性表实现
- 研磨数据结构与算法-04链表
- 三维CAD塑造——基于所述基本数据结构一半欧拉操作模型
- 研磨数据结构与算法-03栈与队列
- 图的历遍-深度优先历遍、广度优先历遍
- 数据结构(二):哈夫曼树
- 最小值
- 数据结构之自建算法库——顺序串
- Android开发中高效的数据结构用SparseArray代替HashMap
- 数据结构之自建算法库——链串
- 数据结构中的排序
- 数据结构之队列
- KMP算法 详解 带视频地址
- 整体二分&cdq分治 ZOJ 2112 Dynamic Rankings