【九度OJ1367】|【劍指offer24】二叉搜索樹的後序遍歷序列

題目描述: 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
****************************************************************/
相關文章
相關標籤/搜索