洛谷P1030 [NOIP2001 普及组] 求先序排列

求先序排列

题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。

输入格式

共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出格式

共一行一个字符串,表示一棵二叉树的先序。

输入输出样例

输入 #1复制

BADC
BDCA

输出 #1复制

ABCD

说明/提示

【题目来源】

NOIP 2001 普及组第三题

代码: 

#include <bits/stdc++.h>
using namespace std;
string a,b;//存中序排列和后序排列
void dfs(string x,string y){
    if(x.size()<=0) return;//如果x不存在了,那说明左子树或右子树搜完了,返回
    cout<<y[y.size()-1];//后序排列的最后一个字母是根节点
    int pos=x.find(y[y.size()-1]);//找到中序排列的根节点位置
    dfs(x.substr(0,pos),y.substr(0,pos));//搜左子树,注意x.substr(0,pos) 0代表下标pos代表截取长度
    dfs(x.substr(pos+1,x.size()-pos-1),y.substr(pos,y.size()-pos-1));//搜右子树
}
int main(){
    cin >> a >> b;
    dfs(a,b);
    return 0;
}
/*
中序遍历:左根右
后序遍历:左右根
样例分析:
中序排列:BADC
后序排列:BDCA
1.找到后序排列的最后一个字母,根节点A
2.在中序排列中找到A的下标pos 1
3.搜左子树 截取中序排列A前面的字母即从下标0截取长度为pos 1的字符串B,
           截取后序排列从0开始截取同样长度pos 1的字符串B
           得到左子树的一个根节点为B
           输出B
           截取后s.size()<=0 return;
           左子树搜完 为B
4.搜右子树 截取中序排列A后面的字母即从下标pos+1 2截取长度为x.size()-pos-1的字符串DC
           截取后序排列从pos 1开始截取长度为y.size()-pos-1的字符串DC
           得到右子树的一个根节点C
           输出C
           截中D
           截后D
           输出D
           截取后s.size()<=0 return;
           右子树搜完 为CD
5.结果 ABCD
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值