题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤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函数的使用,然后核心是递归的运用,我们每得到一个前序遍历的节点就把它在后序遍历中抹除,最后当后序遍历为空时,即是所有前序遍历已经得出的情况了。关于如何分割中序和后序遍历序列,我们在中序遍历中找到根节点的位置,而已知中序遍历顺序是左根右,所以中序遍历中在根节点数左边的即是它的左子树,右边的就是右子树,以此不断分割即可。而后序遍历序列中的节点位置也是和中序遍历位置相通的,所以我们可以以此分割后序遍历序列。
分开两部分递归是为了符合先序遍历的根左右的特性,先遍历左子树然后是右子树。