已知先序遍歷和中序遍歷求後序遍歷

題目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;
}


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