劍指Offer:面試題24——二叉搜索樹的後序遍歷序列(java實現)

問題描述:

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的數組的任意兩個數字都互不相同。

思路:

1.首先後序遍歷的結果是[(左子樹的後序)(右子樹的後序)根結點],那麼我們首先找到了根結點的值,
2.其次,我們知道二叉搜索樹的性質是:任何結點的左子樹的值小於根結點的值,小於右子樹的值。
3.因此,從後向前遍歷,找到第一個小於root.val的,下標爲index, 若index == n-1(n爲數組的長度),則顯然不滿足,返回false, 否則我們可以將數組劃分出來[(左子樹的後序)(右子樹的後序)根結點]。
4.最後對左右子樹遞歸的判斷即可。(但是這裏要注意左子樹或右子樹爲空的情況)

代碼:

public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence == null || sequence.length == 0){
            return false;
        }


        int n = sequence.length;
        if(n == 1 || n == 2){
            return true;
        }


        int index = -1;
        for(int i = n-2; i >= 0; i--){
            if(sequence[i] < sequence[n-1]){
                index = i;
                break;
            }
        }

        int[] left = new int[index+1];
        int[] right = new int[n-2-index];

        for(int i = 0; i <= index; i++){
            if(sequence[i] > sequence[n-1]){
                return false;
            }
            left[i] = sequence[i];
        }
        for(int i = index+1; i< n-1; i++){
            right[i-index-1] = sequence[i];
        }

        if(index == n - 2 && left.length != 0){
            return VerifySquenceOfBST(left);
        }

        if(left.length == 0){
            return VerifySquenceOfBST(right);
        }
        if(right.length == 0){
            return VerifySquenceOfBST(left);
        }


        return VerifySquenceOfBST(left) && VerifySquenceOfBST(right);


    }
發佈了62 篇原創文章 · 獲贊 44 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章