演算法題(三十一):二叉搜尋樹(BST)的後序遍歷序列
阿新 • • 發佈:2018-12-21
題目描述
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。
分析
後序遍歷序列中,最右邊數字也就是根結點,會把數集分為左右兩部分,左邊數集都小於root,右邊數集都大於root。左邊數集和右邊數集與原數集一樣,所以可以用遞迴來做。
程式碼
public class BSTOrder { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = {1,2,3,5,6,4,8,10,9,7}; //非遞迴方法實現遞迴思想 int len = arr.length-1; int i=0; while(len!=0){ while(arr[i]<arr[len]){ i++; } while(arr[i]>arr[len]){ i++; } if(i<len){ System.out.println(false); return; } len--; i=0; } System.out.println(true); System.out.println(fun(arr, 0, len-1));; } //遞迴方法 public static boolean fun(int[] arr, int l, int r){ if(l >=r){ return true; } int i=r; //找到小於root和大於root數集的的邊界,到最後i為小於root的數中最右邊的那個 while(i>l && arr[i-1]>arr[r]){ i--; } //左邊數集(left)應該都小於root for(int j=i-1; j>=l; j--){ if(arr[j]>arr[r]){ return false; } } //左子樹(left)與右子樹(right)的情況 return fun(arr, l, i-1) && fun(arr, i, r-1); } }