求先序排列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度$ 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 100
:R31544805