題目描述: java
輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。 數組
輸入:每一個測試案例包括2行: 測試
第一行爲1個整數n(1<=n<=10000),表示數組的長度。 spa
第二行包含n個整數,表示這個數組,數組中的數的範圍是[0,100000000]。 code
輸出:對應每一個測試案例,若是輸入數組是某二叉搜索樹的後序遍歷的結果輸出Yes,不然輸出No。 htm
樣例輸入:7 5 7 6 9 11 10 8 4 7 4 6 5樣例輸出:
Yes No
解:二叉查找樹(Binary Search Tree),或者是一棵空樹,或者是具備下列性質的二叉樹: 若它的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值; 它的左、右子樹也分別爲二叉排序樹。
後序遍歷則最後一個元素爲根元素 排序
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; public class Main { public static boolean isBST(int[] array, int begin, int end) { int left = begin; int right = end - 1; if(end - begin <= 1) return true; while (left < end && array[end] > array[left]) left++; while (right > begin && array[end] < array[right]) right--; if(left - 1 == right || left == right) return isBST(array, begin, left - 1) && isBST(array, left, end - 1); else return false; } public static void main(String[] args) throws IOException { StreamTokenizer st = new StreamTokenizer(new BufferedReader( new InputStreamReader(System.in))); while (st.nextToken() != StreamTokenizer.TT_EOF) { int n = (int) st.nval; int[] a = new int[n]; for (int i = 0; i < n; i++) { st.nextToken(); a[i] = (int) st.nval; } if (Main.isBST(a, 0, n - 1)) System.out.println("Yes"); else System.out.println("No"); } } } /************************************************************** Problem: 1367 User: aqia358 Language: Java Result: Accepted Time:370 ms Memory:24264 kb ****************************************************************/