已知中序后序,求先序

总览

  • 问题 B: 二叉树,知中序后序,求先序(递归)
    • 解法
    • BUG
    • BUG分析:
    • AC代码

问题 B: 二叉树,知中序后序,求先序(递归)

描述
已知二叉树的中序、后序,建树求先序。

格式
输入格式
中序序列
后序序列

输出格式
先序序列

样例

样例输入 Copy

d g b a e c f

g d b e f c a

样例输出 Copy

a b d g c e f

解法

这题的解法并不难
首先我们知道,后序序列的最后一个一定是父节点
然后我们可以根据父节点,在中序序列里面分出左子树右子树
然后又继续在两个子树里面,继续找子树的父节点,找子子树,一直迭代就行了。
思路简单,可是我这个题不是卡在这里,而是卡在输入
本地测试,输入没问题,可是在OJ上面显示运行错误100%

BUG

先看看这个 运行错误100% 的输入长啥样子:

char a[10000] = {0}, b[10000] = {0};
int i = 0;
while (1)
{
    a[i++] = getchar();
    if (getchar() == '\n')
        break;
}
i = 0;
while (1)
{
    b[i++] = getchar();
    if (getchar() == '\n')
        break;
}

这个从逻辑上分析没有问题,本地能过,可是OJ显示运行错误100%,具体原因不知道,有可能是OJ数据不够严谨,也可能是我存在知识盲区,看不出段代码的BUG在哪,如果有大佬知道,还请在评论区告知一声非常感谢!!!
然后通过Dpprz学长和师傅细心指导,最后改成了下面这段:

int i = 0;
while (scanf("%s", a + i) != EOF)
    i++;

这个感觉和上面那个写法差不多,这个写法一直在覆盖字符串后面的 ‘\0’ ,然后会把两个序列存在一个字符串里面,我们用的时候对半分开就行了。
可是这个写法能过OJ,Amazing!!!

BUG分析:

有可能是因为,OJ上面的测试数据,每一个数据之间不一定都会有空格,可能几个数据连着一起输入
这种情况下,第一种写法就过不了,不过这种情况只是猜测,真正咋回事还不清楚。
如果有大佬知道,麻烦在评论区指点一二,非常感谢!!!

AC代码

下面是AC代码:

#include 
void fun(char *a, char *b, int size) //先序序列,后序序列,序列长度
{
    if (size <= 0)
        return;
    putchar(*(b + size - 1)); //输出父节点
    putchar(' ');
    char *it = a; //在先序序列里面找到父节点
    int count = 0;
    while (a[count] != b[size - 1])
        count++;                                     //计算左子树的节点数
    fun(a, b, count);                                //递归左子树
    fun(a + count + 1, b + count, size - count - 1); //递归右子树
}
char a[10000] = {0};
int main(void)
{
    int i = 0;
    while (scanf("%s", a + i) != EOF)
        i++;
    fun(a, a + i / 2, i / 2);
    return 0;
}

你可能感兴趣的:(二叉树,创新创业预备役寒假学习每日总结)