二叉搜索樹的後序遍歷序列

題目鏈接地址:
http://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

二叉搜索樹也叫二叉排序樹,即左孩子的值全都小於根節點,右孩子的值全都大於根節點,根節點的左右孩子也是二叉搜索樹。
給定如下一顆二叉搜索樹:
這裏寫圖片描述
(注:我寫的時候圖片顯示的是下面的二叉排序樹,現在竟然顯示的是別人的java項目結構圖!!!)
這裏寫圖片描述
其後序遍歷爲:2 9 5 16 17 15 19 18 12。
現在假設給定了某個後序遍歷數組爲:2 9 5 16 17 15 19 18 12
我們從根節點出發,即節點12,如果此數組是某個二叉排序樹後續遍歷的結果,也就說數組中的數據必然可以分成兩部分:一部分是全小於12,一部分全大於12,我們先從數組找第一個大於12的數即16,那麼可以該數組可以被分成兩部分
第一部分:2 9 5
第二部分:16 17 15 19 18
要使根節點12滿足二叉排序樹的定義,那麼必定有第一部分全部小於12,第二部分全部大於12。
此時第一部分和第二部分又變成了根節點12的左右孩子要滿足二叉搜索樹的情況,第一部分表示的子樹的根節點爲5,第二部分表示的子樹的根節點爲18,即我們現在要判斷根節點爲5和根節點爲18的兩棵樹是否都滿足二叉排序樹的定義,這是一個遞歸的過程。

    class ListNode{
        int val;
        ListNode next=null;
        ListNode(int val) {
            this.val=val;
        }
    }
        public int findPosition(int[] sequence,int start,int end,int val){
        //從sequence的start-end找到第一個大於val的位置
        int i=start;
        for(;i<=end;i++){
            if(sequence[i]>val)
                break;
        }
        return i;
    }
    public boolean isSquenceOfBST(int[] sequence,int start,int end){
        if(end<0||start>=sequence.length)
            return true;
        int val=sequence[end];
        int position=0;
        if(start<end){
            //將數組在position爲位置分成兩部分,左邊一部分必然全小於val,右邊一部分必然要全大於val
            position=findPosition(sequence, start, end-1, val);
            for(int i=position;i<=end;i++){
                if(sequence[i]<val) //如果出現右邊部分有數字小於val則不符合二叉搜索樹的定義
                    return false;
            }
        }else{
            return true;
        }
        //判斷左右子樹是否符合二叉搜索樹的定義
        return isSquenceOfBST(sequence,start,position-1)&&
                isSquenceOfBST(sequence, position, end-1);
    }
    /**
     * 輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果
     * */
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length<=0)
            return false;
        return isSquenceOfBST(sequence, 0, sequence.length-1);
    }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章