判斷整數序列是否是二元查找樹的後序遍歷結果

判斷整數序列是否是二元查找樹的後序遍歷結果

題目:輸入一個整數數組,判斷該數組是否是某二元查找樹的後序遍歷的結果。數組

若是是返回 true,不然返回 false。spa

例如輸入 五、七、六、九、十一、十、8,因爲這一整數序列是以下樹的後序遍歷結果:code

8遞歸

/    \io

6    10編譯

/    \    /    \class

5    7    9    11遍歷

所以返回 true。總結

若是輸入 七、四、六、5,沒有哪棵樹的後序遍歷的結果是這個序列,所以返回 false。di


思路:

二叉查找的特徵:左子樹的各個值均小於根,右子樹的各個值均大於跟

後序遍歷的特徵:最後一個是根,便利順序,左右跟。遞歸

好了,總結能夠獲得:

最後一個是根,最開始連續若干個數小於根的是左子樹的節點,以後連續若干個大於根的是右子樹的節點(左右子樹均可能爲空),而後遞歸描述。


代碼描述以下(GCC編譯經過):

#include "stdio.h"
#include "stdlib.h"

int isPostorderResult(int a[],int n);
int helper(int a[],int s,int e);

int main(void)
{
	int a[7] = {5,7,6,9,11,10,8};
	int b[4] = {7,4,6,5};
	int tmp;

	tmp = isPostorderResult(a,7);
	printf("%d",tmp);

	return 0;
}



int isPostorderResult(int a[],int n)
{
	return helper(a,0,n-1);
}

int helper(int a[],int s,int e)
{
	int i,j,root;
	
	if(s == e)
		return 1;	

	for(i=0;i<e && a[i]<a[e];i++);
	if(i != 0 && helper(a,s,i-1) == 0)
		return 0;

	for(j=i;j<e && a[j]>a[e];j++);
	if(j==e && helper(a,i,j-1) == 1)
		return 1;
	else
		return 0;
	
	
}
相關文章
相關標籤/搜索