6.3.3 二叉樹重建【算法入門經典】【雙十一大禮包】

輸入一棵二叉樹的先序遍歷和中序遍歷,輸出它的後序遍歷序列。學習

運行如圖ui

目前還有一些細節沒有懂,不過不影響我仍然喜歡學習的心情~spa

#include<stdio.h>
#include<string.h>
#define N 1000
char s1[N],s2[N],ans[N];
//s1是先序遍歷,s2是中序遍歷 
void build(int n,char *s1,char *s2,char *s)
{//構造長度爲n的後續遍歷。 
    if(n <= 0)    return;
    int p = strchr(s2,s1[0])-s2;//找到根結點在中序遍歷中的位置 
    build(p,s1+1,s2,s);//遞歸構造左子樹的後續遍歷 
    build(n-p-1,s1+1+p,s2+1+p,s+p);//遞歸構造右子樹的後續遍歷 
    s[n-1] = s1[0];//把根結點添加到最後
    return;
 } 
int main()
{
    while(scanf("%s%s",s1,s2)!=EOF)
    {
        int n = strlen(s1);
        build(n,s1,s2,ans);
        ans[n] = '\0';//ans存儲後續遍歷序列 
        printf("%s\n",ans);
    }
    return 0;
}
相關文章
相關標籤/搜索