二叉树重建 - (先序遍历、中序遍历、后序遍历)

对于一棵 二叉树T,我们可以递归定义它的先序遍历,中序遍历,后序遍历:


       1、先序遍历  ( PreOrder(T) = T的根节点 + PreOrder(T的左子树) + PreOrder(T的右子树) )

       2、中序遍历  ( InOrder(T) = InOrder(T的左子树) + T的根节点 +  InOrder(T的右子树) )

       3、后序遍历  ( PostOrder(T) = PostOrder(T的左子树) + PostOrder(T的右子树)  + T的根节点 )

其中,加号表示字符串连接运算。例如,如图所示的二叉树,先序遍历为 DBACEGF ,中序遍历为 ABCDEFG

二叉树重建 - (先序遍历、中序遍历、后序遍历)_第1张图片(画的略丑,请勿嫌弃)

要求:输入一棵树的先序遍历和中序遍历,输出他的后序遍历

样例输入:

DBACEGF ABCDEFG

BCAD CBAD

样例输出:

ACBFGED

CDAB

代码:

#include <stdio.h>
#include <string.h>
#define MAXN 1000 + 10
void build(int n, char *s1, char *s2, char *s){
    if(n <= 0) return ;
    int p = strchr(s2,s1[0]) - s2; //找到根节点在中序遍历中的位置
    build(p,s1+1,s2,s);     //递归构造左子树的后序遍历
    build(n-p-1, s1+p+1,s2+p+1,s+p); //构造右子树的后序遍历
    s[n-1] = s1[0];
}
int main(){
    char s1[MAXN],s2[MAXN],ans[MAXN];
    while(scanf("%s%s",s1,s2)==2){
        int nLen = strlen(s1);
        build(nLen,s1,s2,ans);
        ans[nLen] = '\0';
        puts(ans);
    }
    return 0;
}


通过这个示例,相信对与二叉树的遍历方式有了一定的了解吧,不知道你们有没有,反正我是有。

传送门:二叉树层次遍历


你可能感兴趣的:(二叉树重建 - (先序遍历、中序遍历、后序遍历))