1. 程式人生 > >劍指Offer- 二叉搜尋樹的後序遍歷序列(Java實現)

劍指Offer- 二叉搜尋樹的後序遍歷序列(Java實現)

題目描述

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

思路分析:

BST的後序序列的合法序列是,對於一個序列S,最後一個元素是x (也就是根),如果去掉最後一個元素的序列為T,那麼T滿足:T可以分成兩段,前一段(左子樹)小於x,後一段(右子樹)大於x,且這兩段(子樹)都是合法的後序序列。完美的遞迴定義 : ) 。

先從頭開始,找出最開始比根大的數的位置index,該位置的左側陣列均比根小,只需判斷該部分陣列是否滿足條件。接著遍歷右側,判斷是否有比根小的節點,如果有則返回錯誤。如果沒有,則繼續遞迴判斷左右子樹。

程式實現如下:

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        
        if(sequence == null || sequence.length<1 ){
            return false;
        }
        int min = 0;
        int max = sequence.length-1;
        
        return isBST(sequence,min,max);
        
    }
    
    public boolean isBST(int[] sequence,int min , int max ){
 
        if( max-min+1 <2 ){
            return true;
        }
        int index = min; //初始化index節點。
        int root = sequence[max] ;
        
        for(int i = min ; i < max+1 ; i++){
            if(sequence[i] > root || i == max){
                index = i;
                break;
            }
        }
        
        for(int i = index ; i < max ; i++){
             if( sequence[i] < root ){
                return false;
            }
        }
        
        return isBST(sequence,min,index-1) && isBST(sequence,index,max-1);
    }
}