codevs——1013 求先序排列

1013 求先序排列

 

2001年NOIP全国联赛普及组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述  Description

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。

输入描述  Input Description

两个字符串,分别是中序和后序(每行一个)

输出描述  Output Description

一个字符串,先序

样例输入  Sample Input

BADC

BDCA

样例输出  Sample Output

ABCD

 

代码:

#include<vector>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100000
#define maxn 123456
using namespace std;
char a[N],b[N];
int c[N],d[N]; 
void dfs(int l,int r,int L,int R)
{
    printf("%c",b[R]);
    if(d[R]>l) dfs(l,d[R]-1,L,d[R]-l+L-1);//说明他有左子树,那么对她的左子树进行查找 
                        //对一棵树来说,它的左子树的最左端一定是L,最右端就是
                        //它的根所在的地方(在中序排序中)+减去中序排序的左端点——这是求出了他的左子树的长度 
                        //那他的在后续排序中的最右端是在后续排序的左端+他的左子树的长度 
    if(d[R]<r) dfs(d[R]+1,r,R-r+d[R],R-1);//说明它具有右子树,那么对他的右子树进行查找。
                        // 对一棵树来说,他的右子树在后续遍历中左端点的的位置为:R-r+d[R]
                        //r-d[R]是求出了这棵树的右子树的长度,那他的左端点为当前的右端点减去右子树的长度 
 } 
int main()
{
    scanf("%s",a);
    scanf("%s",b);
    int l=strlen(a);//对于一棵树来说:他的中序排序和它的后续排序的长度是相同的,所以在这里我们只要求他中序排序的长度就好了! 
    for(int i=0;i<l;i++)
      c[a[i]]=i;//储存中序排序的每个点在中序排序中的位置 
    for(int i=0;i<l;i++ )
      d[i]=c[b[i]];//储存后序遍历的每个点在中序遍历中的位置; 
    dfs(0,l-1,0,l-1);//同时在中序遍历和后序便利中进行查找(第一个1~n是中序遍历要进行查找的位置,第二个是后续遍历要查找的位置) 
    return 0; 
}

 

转载于:https://www.cnblogs.com/z360/p/7212451.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值