poj2255

题目大意:
树恢复??树复原??
Valentine非常喜欢玩二叉树的游戏,他非常喜欢在二叉树的树根上随机的写上一下大写字母,这是她创造的一个例子:
                                               D 
/ \
/ \
B E
/ \ \
/ \ \
A C G
/
/
F

为了记录它的树为了以后研究,她给每个树写了两个串,一个先序遍历,(根,左子树,右子树)和一个中序遍历(左子树,根,右子树),上图的先序遍历就是DBACEGF 并且中序遍历是ABCDEFG。
现在她想她有了一对字符串有足够的信息重建那棵树(但是她绝对不会做的)。
现在多年以后,在一次看到这些字符串,她意识到重建树确实有可能,但是在一个树里面他绝不使用相同的字母两次,但是手工重建很快就变得很乏味。所以现在你需要写一个程序帮助完成这个工作。
输出树的后续遍历

分析
因为树不是完全二叉树,所以应该怎么做呢??
好吧,先想一下。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 #include<stdio.h>

#include< string.h>
#define maxn 100
void Build( char s1[],  char s2[],  char s[],  int n)
{
     if(n <=  0)
         return ;
     int k = strchr(s2, s1[ 0]) - s2;
    Build(s1+ 1, s2, s, k);
    Build(s1+k+ 1, s2+k+ 1, s+k, n-k- 1);
    s[n- 1] = s1[ 0];
}
int main()
{
     char s[maxn], s1[maxn], s2[maxn];
     while(scanf( " %s%s ", s1, s2) != EOF)
    {
         int len = strlen(s1);
        Build(s1, s2, s, len);
        s[len] =  0;
        puts(s);
    }
     return  0;
}

你可能感兴趣的:(poj)