[luogu p1030] 求先序排列

传送门

求先序排列

题目描述

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

输入输出格式

输入格式

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

输出格式

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

输入输出样例

输入样例 #1

BADC
BDCA

输出样例 #1

ABCD

分析

这道题要我们求出这棵二叉树的先序。而先序是根左右,左右子树也是根左右,这意味着我们要找根,递归左右子树。左右子树再找根,递归左右子树。也就是说,我们要不断找根

怎么找根呢?很显然这个主二叉树的根就是后序遍历中最后一个。这点不难理解。接下来我们要递归左右子树,那么怎么递归左右子树呢?我们把目标定向中序遍历,中序遍历是左根右,根在中间,两边就是左右子树。也就是说我们在后序遍历找根,中序遍历递归左右子树。然后不断输出根,每递归一个左右子树就输出它的根,这样就是前序遍历了。

叭叭叭这么多,是时候上代码了。注意字符串的截断处理。

代码

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2020-03-09 00:02:34 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2020-03-09 09:18:02
 */
#include <iostream>
#include <cstdio>

void work(std :: string s1, std :: string s2) {
    if(s1.size() == 0) return ;
    char root = s2[s2.length() - 1];
    std :: cout << root;
    int pos = s1.find(root);
    work(s1.substr(0, pos), s2.substr(0, pos));
    work(s1.substr(pos + 1), s2.substr(pos, s2.length() - pos - 1));
}

int main() {
    std :: string s1, s2;
    std :: cin >> s1 >> s2;
    work(s1, s2);
    return 0;
}

评测结果

AC 100R31544805

posted @ 2020-03-09 09:20  dbxxx  阅读(310)  评论(0编辑  收藏  举报