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

题目描述

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

输入格式

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

输出格式

1行,表示一棵二叉树的先序。

输入输出样例

输入 #1

BADC
BDCA

输出 #1

ABCD

首先我们可以知道的是,后序遍历序列的最后一位一定是根节点,即先序遍历序列的第一位,然后我们可以知道的一个抽象特性是“后序遍历序列的最后一位一定是此先序遍历序列的第一位”,以此为根据,我们以中序遍历序列为基点将后序遍历序列不断分成两块,分别是“当时根节点”的左右子树,然后再根据分出来的后序遍历左右子树得出前序遍历的第一位,于是,我们可以在一个又一个的分割的过程中得出前序遍历序列。

实现代码为:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string.h>
using namespace std;
string mid,bac;
void fr(string m,string b)
{
    if(b.empty())
        return;
    char c=b[b.length()-1];
    cout <<c;
    b.erase(b.length()-1);
    int i=m.find(c);
    string lb=b.substr(0,i);
    string lm=m.substr(0,i);
    string rb=b.substr(i);
    string rm=m.substr(i+1);
    fr(lm,lb);
    fr(rm,rb);
}
int main()
{
    cin >>mid>>bac;
    fr(mid,bac);
}

首先,要知道string函数的使用,然后核心是递归的运用,我们每得到一个前序遍历的节点就把它在后序遍历中抹除,最后当后序遍历为空时,即是所有前序遍历已经得出的情况了。关于如何分割中序和后序遍历序列,我们在中序遍历中找到根节点的位置,而已知中序遍历顺序是左根右,所以中序遍历中在根节点数左边的即是它的左子树,右边的就是右子树,以此不断分割即可。而后序遍历序列中的节点位置也是和中序遍历位置相通的,所以我们可以以此分割后序遍历序列。

分开两部分递归是为了符合先序遍历的根左右的特性,先遍历左子树然后是右子树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值