题目描述
由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树,所以对二叉树做如下处理,将二叉树的空结点用·补齐,如图所示。我们把这样处理后的二叉树称为原二叉树的扩展二叉树,扩展二叉树的先序和后序序列能唯一确定其二叉树。现给出扩展二叉树的先序序列,要求输出其中序和后序序列。
输入
输入扩展二叉树的先序序列
输出
输出其中序和后序序列
样例输入
ABD..EF..G..C..
样例输出
DBFEGAC
DFGEBCA
#include<iostream>
#include<cstring>
using namespace std;
char a[1000];
int n,k;
struct tree{
int l,r;
}t[1000];
void dfs(){
int fa=k;
if(a[k+1]!='.'){ //'.'后面的第一个字母是右分支,前面不是 '.' 的字母都是左分支
t[fa].l=k+1;
k++;
dfs();
}
else k++;
if(a[k+1]!='.'){
t[fa].r=k+1;
k++;
dfs();
}
else k++;
}
void mid(int p){ //中序遍历输出
if(t[p].l)
mid(t[p].l);
cout<<a[p];
if(t[p].r)
mid(t[p].r);
}
void later(int p){ //后序遍历输出
if(t[p].l)
later(t[p].l);
if(t[p].r)
later(t[p].r);
cout<<a[p];
}
int main()
{
cin>>a;
n=strlen(a);
dfs();
mid(0);
cout<<endl;
later(0);
return 0;
}