标签:
问题描述:
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树的后序遍历结果:
10
/ \
6 14
/ \ / \
4 8 12 16
因此返回true。
如果输入6, 5, 8, 5, 7 ,则返回false。
问题分析:
在后续遍历得到的序列中,最后一个元素为树的根结点。根节点元素将数组分为两部分,左边都小于根节点,右边都大于根节点。递归的确认左右是否是二元查找树即可。
代码实现:
/** * @project: oschina * @filename: IT9.java * @version: 0.10 * @author: JM Han * @date: 8:40 2015/11/5 * @comment: Test Purpose * @result: */ import static tool.util.*; public class IT9 { static boolean verify(int start, int end, int[] a){ //只有一个元素时 = ,返回true //左子树不存在是 > , 返回true if(start >= end) return true; int i; int j; for(i = start; a[i] < a[end]; i++); for(j = i; a[j] > a[end]; j++); //左子树和右子树加上root可以遍历完此部分数组,否则不是BST if(j != end) return false; boolean right = verify(start, i-1, a); boolean left = verify(i, j - 1, a); //进当左右子树都符合条件返回true if(right && left) return true; return false; } public static void main(String[] args) { //int[] a = new int[]{4,8,6,12,16,14,10}; //int[] a = new int[]{4,8,6,12,16,11,10}; //int[] a = new int[]{4,8,6,9,11,12,10}; //int[] a = new int[]{4,8,6,12,9,11,10}; boolean res = verify(0, a.length-1, a); String isn = res?"is":"isn‘t"; System.out.println("Array " + isn + " a tree of postorder tranversal"); } }
IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果
标签:
原文地址:http://my.oschina.net/jimmyhan/blog/526570