【演算法】判斷整數序列是不是二元查詢樹的後序遍歷結果

pengfoo發表於2012-10-01

題目:輸入一個整數陣列,判斷該陣列是不是某二元查詢樹的後序遍歷的結果。如果是返回true,否則返回false。

例如輸入5、7、6、9、11、10、8,由於這一整數序列是如下樹的後序遍歷結果:

         8
       /  \
      6    10
    / \    / \
   5   7   9  11

因此返回true。

如果輸入7、4、6、5,沒有哪棵樹的後序遍歷的結果是這個序列,因此返回false。

樹的題目一般都是遞迴的思路,因為是因為是排序樹,而且是後序,所以思路是序列最後一個必是根節點,從前往後遍歷,比根節點小的都是其左子樹,並且位於序列的左半部分,比其大的為其右子樹,應該位於其右半部分。左右子樹按上述思路分別進行判斷。

參考程式碼實現:

#include<stdio.h> 

int isResOfPostTravelOfBST(int a[], int first, int last)
{
	int flag =1;
	int i = first,j;
	int root = a[last];	//取得根節點的值,後序遍歷中,根節點一定在最後
	if(first == last)//當剩一個元素了,則肯定是 後序遍歷的結果
		return flag;
	while(a[i] < root)//左子樹
	{
		i++;
	}
	j = i;//從j開始是右子樹的開始
	while(j < last)
	{
		if(a[j] < root)//如果是後序遍歷,則右子樹的值都應該比根節點的值大
		{
			flag = 0;
			return flag;
		}
			
		j++;
	}
	return isResOfPostTravelOfBST(a,first,i-1) && isResOfPostTravelOfBST(a, i,last-1);//遞迴判斷左右子樹是不是後序遍歷

}


int main()//測試程式
{
	
	int a[]={5,7,6,9,11,10,8};
	int b[]={7,4,6,5};
	if(isResOfPostTravelOfBST(a, 0 , 6))
		printf("a yes\n");
	else
		printf("a no\n");
	if(isResOfPostTravelOfBST(b, 0 , 3))
		printf("b yes\n");
	else
		printf("b no\n");
	
	return 0;
}


 

相關文章