劍指Offer- 二叉搜尋樹的後序遍歷序列(Java實現)
阿新 • • 發佈:2018-12-04
題目描述
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出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); } }