樹遍歷相關算法

樹可以通過前序+中序求後序,或者後序+中序求前序。我們無法通過前序和後序求中序,因爲後序加前序無法唯一確定一顆二叉樹。

例如:

前序:ab

後序:ba

這樣你就無法判斷b是a的左子樹還是右子樹。


通過前序和中序求後序,程序如下:

#include <stdio.h>
#include <string.h>
int find(char c,char A[],int s,int e) /**//* 找出中序中根的位置。 */
{
	int i;
	for(i=s;i<=e;i++)
		if(A[i]==c) return i;
}
/**//* 其中pre[]表示先序序,pre_s爲先序的起始位置,pre_e爲先序的終止位置。 */
/**//* 其中in[]表示中序,in_s爲中序的起始位置,in_e爲中序的終止位置。 */
/**//* pronum()求出pre[pre_s~pre_e]、in[in_s~in_e]構成的後序序列。 */
void pronum(char pre[],int pre_s,int pre_e,char in[],int in_s,int in_e)
{
	char c;
	int k;
	if(in_s>in_e)    return ;                 /**//* 非法子樹(子樹爲空),完成。 */
	if(in_s==in_e)
	{
		printf("%c",in[in_s]); /**//* 子樹子僅爲一個節點時直接輸出並完成。 */
		return ;
	}
	c=pre[pre_s];                           /**//* c儲存根節點。 */
	k=find(c,in,in_s,in_e);                 /**//* 在中序中找出根節點的位置。 */
	pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /**//* 遞歸求解分割的左子樹。 */
	pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e); /**//* 遞歸求解分割的右子樹。 */
	printf("%c",c);                         /**//* 根節點輸出。 */
}
int main()
{
	char pre[]="abdc";
	char in[]="bdac";
	printf("The result:");
	pronum(pre,0,strlen(in)-1,in,0,strlen(pre)-1);
	//getch();
	return 0;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章