题目:大概就是给定一个二叉树的后序遍历和中序遍历,要求你输出它的层序遍历
输入:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出
4 1 6 3 5 7 2
我的数据结构一向都是靠异想天开的,让我建一个二叉树,no!代码太丑了,我自己都不想看。(而且之前孤陋寡闻没听说过层序遍历,虽然根据树来说 BFS 也很好想)这题有输出格式的坑,最后一位不能多出来一个空格,空格不能被吞掉。
然后我就开始观察题目,后序遍历,众所周知,根在最后面,然后我看到了中序,可以肯定的是,中序遍历中,根的左边的点都是它的左子树,右边都是它的右子树(废话),而且在后序遍历里同一层的左子树总是会比右子树的优先级高,那就很容易想到一种做法,输入后序(不需要存储)的时候记录每个结点在后序中的位置,并且记录最后一个点(根节点),通过递归的方法在中序遍历中先给左子树加优先级,再给右子树加优先级。优先级代表这个结点在树中的层数。最后进行排序,优先级高或者同一优先级在后序遍历中的位置靠前的结点应当往前排。
排好序后直接输出答案即可。
附上代码
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
ll n, x, p, a[35];
struct node
{
ll num, id;
}b[35];void dfs(ll l, ll r, ll pos)
{
if(l > r)return;
ll k1 = l;
for(int i = l;i <= r;++i)
if(a[b[i].num] > a[b[k1].num])
k1 = i;
b[k1].id = pos;
dfs(l, k1 - 1, pos + 1);
dfs(k1 + 1, r, pos + 1);
}bool cmp(node xx, node yy)
{
return (xx.id < yy.id) || (xx.id == yy.id && (a[xx.num] < a[yy.num]));
}
int main()
{
cin >> n;
for(int i = 1;i <= n;++i)
{
cin >> x;
a[x] = i;
}
for(int i = 1;i <= n;++i)
{
cin >> b[i].num;
if(b[i].num == x)
p = i;
}
b[p].id = 1;
dfs(1, p - 1, 2);
dfs(p + 1, n, 2);
sort(b + 1, b + n + 1, cmp);
for(int i = 1;i < n;++i)
cout << b[i].num << ' ';
cout << b[n].num;
return 0;
}