【Java】 劍指offer(33) 二叉搜尋樹的後序遍歷序列 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
阿新 • • 發佈:2018-11-09
本文參考自《劍指offer》一書,程式碼採用Java語言。
題目
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。
思路
二叉樹後序遍歷陣列的最後一個數為根結點,剩餘數字中,小於根結點的數字(即左子樹部分)都排在前面,大於根結點的數字(即右子樹部分)都排在後面。根據遍歷陣列的這個特性,可以編寫出一個遞迴函式,用於實現題目所要求的判斷功能。
測試算例
1.功能測試(左斜樹;右斜樹;能對應的二叉樹;不能對應的二叉樹序列)
2.特殊測試(null;一個結點)
Java程式碼
//題目:輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。 //如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。 public class SquenceOfBST { public boolean verifySquenceOfBST(int[] sequence) { if(sequence== null || sequence.length<=0) return false; return verifyCore(sequence, 0, sequence.length-1); } private boolean verifyCore(int[] sequence,int start,int end) { if(start>=end) return true; //判斷左子樹 int mid=start; while(sequence[mid]<sequence[end]) mid++; //判斷右子樹 for(int i=mid;i<end;i++) { if(sequence[i]<sequence[end]) return false; } return verifyCore(sequence, start, mid-1)&&verifyCore(sequence, mid, end-1); } }
收穫
1.尋找出序列規律,就能較快得到思路。此題如果改為BST的前序遍歷也是相同的思路。
2.對於要求處理二叉樹序列的問題:找到根結點後,拆分出左右子樹,對左右子樹可以進行遞迴處理。
3.雖然有了思路,但自己在編寫程式碼的時候還是寫得比較亂,花了一些時間才能修改出比較簡潔和清晰易懂的版本,說明自己寫的程式碼量還是不夠,要繼續多加練習。