【Java】 劍指offer(33) 二叉搜索樹的後序遍歷序列

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

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

題目 

  輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則返回true,不然返回false。假設輸入的數組的任意兩個數字都互不相同。數組

思路

  二叉樹後序遍歷數組的最後一個數爲根結點,剩餘數字中,小於根結點的數字(即左子樹部分)都排在前面,大於根結點的數字(即右子樹部分)都排在後面。根據遍歷數組的這個特性,能夠編寫出一個遞歸函數,用於實現題目所要求的判斷功能。函數

測試算例 post

  1.功能測試(左斜樹;右斜樹;能對應的二叉樹;不能對應的二叉樹序列)測試

  2.特殊測試(null;一個結點)url

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的前序遍歷也是相同的思路。spa

  2.對於要求處理二叉樹序列的問題:找到根結點後,拆分出左右子樹,對左右子樹能夠進行遞歸處理。htm

  3.雖然有了思路,但本身在編寫代碼的時候仍是寫得比較亂,花了一些時間才能修改出比較簡潔和清晰易懂的版本,說明本身寫的代碼量仍是不夠,要繼續多加練習。blog

 

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

相關文章
相關標籤/搜索