1. 程式人生 > >演算法題(三十一):二叉搜尋樹(BST)的後序遍歷序列

演算法題(三十一):二叉搜尋樹(BST)的後序遍歷序列

題目描述

輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出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);
	}

}