題目848:
描述
輸入一棵二叉樹的先序遍歷和中序遍歷,輸出它的後序遍歷。
- 輸入
- 輸入有多組數據(少於100組),以文件結尾結束。
每組數據僅一行,包括兩個字符串,中間用空格隔開,分別表示二叉樹的先序序列和中序序列(字符串長度小於26,輸入數據保證合法)。 - 輸出
- 每組輸出數據單獨佔一行,輸出對應得後序序列。
- 樣例輸入
-
DBACEGF ABCDEFG
-
BCAD CBAD
- 樣例輸出
-
ACBFGED
-
CDAB
解析:
題目給出了先序和中序遍歷的字符串,按照先序的第一個元素在中序中找到相同的元素時,此時中序的左邊元素歸爲左子樹範圍,右邊元素歸爲右子樹範圍。以此分下去,具體代碼如下
代碼:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定義一個二叉樹
typedef struct node
{
char data;
struct node *lchild,*rchild;//左孩子和右孩子
}STU;
//根據先序遍歷和中序遍歷建立出二叉樹來
STU *tree(char *str1,char *str2,int len)//傳先序遍歷字符串和中序遍歷字符串數組 和字符串長度兩個一樣長隨便一個就可以
{
int i;//for循環所需變量
STU *heart;//定義頭指針
if(len==0)//長度爲零返回空
return NULL;
heart=(STU *)malloc(sizeof(STU));//動態分配空間
heart->data=str1[0];//先序的首元素做爲節點
//找到每一次的先序數組中頭一個元素在中序中的位置
for(i=0;i<len;i++)
if(str1[0]==str2[i])
break;
//循環調用tree找左孩子和右孩子 得到二叉樹
heart->lchild=tree(str1+1,str2,i);
heart->rchild=tree(str1+i+1,str2+i+1,len-i-1);
return heart;
}
//從二叉樹中找到後續遍歷的結果保存到數組ret中
void printftree(STU *heart,char ret[],int *cnt)//*cnt是用作計數器記數組ret的下標
{
if(heart!=NULL)//樹不爲空
{
//循環調用實現後續遍歷
printftree(heart->lchild,ret,cnt);
printftree(heart->rchild,ret,cnt);
ret[(*cnt)++] = heart->data;//將遍歷的結果存入數組是以一個字符一個字符的存進去
}
}
int main ()
{
char str1[27],str2[27];
char ret[100][27];//定義100個一次可存27個字符的靜態空間
int len;//接收字符串長度
STU *heart;//接收返回的heart頭指針的指針變量
int len2 = 0;//數組ret組數的計數器
int cnt ;//數組ret一組字符長度的計數器
while(scanf("%s%s",str1,str2)!=EOF)
{
len=strlen(str1);
heart=tree(str1,str2,len);
cnt = 0;
printftree(heart,ret[len2],&cnt);//傳樹頭結點和ret[0] 還有計數器cnt
ret[len2][cnt] = NULL;//存後序遍歷結果的數組以NULL結尾
len2 ++;
}
int i = 0;
for(;i<len2;i++){
printf("%s\n",ret[i]);//輸出所有組 後序遍歷結果
}
return 0;
}