hiho刷题日记——第十天后序遍历

题目

根据给出的二叉树的前序遍历和中序遍历输出后序遍历。

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为一个由大写英文字母组成的字符串,表示该二叉树的前序遍历的结果。

每组测试数据的第二行为一个由大写英文字母组成的字符串,表示该二叉树的中序遍历的结果。

对于100%的数据,满足二叉树的节点数小于等于26。

输出

对于每组测试数据,输出一个由大写英文字母组成的字符串,表示还原出的二叉树的后序遍历的结果。

思路

令f(char *s1,char *s2)为前序遍历为s1,中序遍历为s2的后序遍历输出。

1.取出通过s1的第一个字符为当前的root
2.根据root在s2中找出左子树和右子树的数量
3.分别找出s1,s2的左右子树
4.调用f(s1left,s2left) f(s1right,s2right2)
5.最后输出root

代码

#include<cstdio>
#include<cstring>
using namespace std;

void f(char *a,char *b)
{
    if(strlen(a)<=1) 
    {
        printf("%s",a);
        return;
    }
    char root=a[0];
    char* aleft;
    char* aright;
    char* bleft;
    char* bright;
    int alen,blen;

    alen=strlen(a);
    blen=strlen(b);

    aleft=a;
    bleft=b;
    bright=strchr(b,root);
    *bright='\0';

    int len=bright-bleft;
    for(int i=0;i<len;i++) *(aleft+i)=*(aleft+i+1);
    *(aleft+len)='\0';

    aright=aleft+len+1;
    bright=bright+1;

    f(aleft,bleft);
    f(aright,bright);
    printf("%c",root);
}

int main()
{
    char a[30],b[30];
    scanf("%s%s",a,b);
    f(a,b);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值