1. 程式人生 > >【Java】 劍指offer(33) 二叉搜尋樹的後序遍歷序列 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

【Java】 劍指offer(33) 二叉搜尋樹的後序遍歷序列 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

本文參考自《劍指offer》一書,程式碼採用Java語言。

更多:《劍指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.雖然有了思路,但自己在編寫程式碼的時候還是寫得比較亂,花了一些時間才能修改出比較簡潔和清晰易懂的版本,說明自己寫的程式碼量還是不夠,要繼續多加練習。

 

更多:《劍指Offer》Java實現合集