【题目描述】
树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。
假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。
【输入】
两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。
【输出】
一行,表示二叉树的先序序列。
【输入样例】
DBEAC
ABCDE
【输出样例】
ABDEC
这道题我刚刚做的时候就觉得使
1339 |
的举一反三,可是有一个难点总是困扰着我:如何找根呢?然后我在观察后得到了结论:
中序是不能单独用来找根的——王恩全
所以必须要在层次遍历上找根
那么如何找呢?
这个点我想了不下于3天,我也是服了
最后终于灵光乍现,找到了思路:可以把中序遍历的[i,r]内的元素中在层序遍历出现的位置最靠前的位置做根
找到根后,其余的都和1339那道题差不多了
对了,这里层序遍历是不需要划分区间的!
代码:
#include <bits/stdc++.h>
using namespace std;
string cen,mid;
int fi(int l,int r)
{
int ans = 0x3f3f3f3f3f,anp = 0x3f3f3f3f3f;
for(int i = l; i <= r; i++)//遍历mid
for(int j = 0; j < cen.size(); j++)//遍历cen
if(cen[j] == mid[i])
if(j < anp)
{
anp = j;
ans = i;
}
return ans;
}
void f(int l,int r)
{
int m = fi(l,r);//根在mid中的下标
cout<<mid[m];//输出
if(m > l) f(l,m - 1);//左子树
if(m < r) f(m + 1,r);//右子树
}
int main()
{
cin>>mid>>cen;
f(0,mid.size() - 1);
return 0;
}
//DBEAC
//ABCDE
最后补充一点:
直接通过层次遍历来构建树,最后输出是不行的!!!因为题目没说一定是完全二叉树!!!
40分的代码(通过层次遍历来构建树,最后输出的代码)
#include <bits/stdc++.h>
using namespace std;
string cen,mid;
struct node
{
char data;
int l,r;
node ()
{
l = data = r = 0;
}
};
node a[10001];
void xx(int n)
{
cout<<a[n].data;
if(a[n].l) xx(n * 2);
if(a[n].r) xx(n * 2 + 1);
}
int main()
{
cin>>mid>>cen;
for(int i = 1; i <= cen.size(); i++)
{
a[i].data = cen[i - 1];
if(i * 2 <= cen.size()) a[i].l = i * 2;
if(i * 2 + 1 <= cen.size()) a[i].r = i * 2 + 1;
}
xx(1);
return 0;
}
3Q for您能够看到这里,感谢观看~