問題描述:java
輸入一個整數數組,判斷該數組是否是某二元查找樹的後序遍歷的結果。數組
若是是返回true,不然返回false。post
例如輸入4, 8, 6, 12, 16, 14, 10,因爲這一整數序列是以下樹的後序遍歷結果:spa
10
/ \
6 14
/ \ / \
4 8 12 16code
所以返回true。遞歸
若是輸入6, 5, 8, 5, 7 ,則返回false。io
問題分析:class
在後續遍歷獲得的序列中,最後一個元素爲樹的根結點。根節點元素將數組分爲兩部分,左邊都小於根節點,右邊都大於根節點。遞歸的確認左右是不是二元查找樹便可。import
代碼實現:date
/** * @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"); } }