L2-011 玩转二叉树 分数 25 作者 陈越 单位 浙江大学 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式: 在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例: 7 1 2 3 4 5 6 7 4 1 3 2 6 5 7 输出样例: 4 6 1 7 5 3 2
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+10;
int n,x,cnt=0,f=0;
string s1,s2;
int tree[N]={};
void init()
{
memset(tree,0,sizeof(tree));
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> x;
s1+=(x+'0');
}
for(int i=1;i<=n;i++)
{
cin >> x;
s2+=(x+'0');
}
}
void dfs(string s1,string s2,int root)
{
//s1中序,s2前序
char root1=s2[0];
tree[root]=root1-'0';
cnt++,f++;
int l=s1.find(root1);//左子树长度
int r=s1.size()-s1.find(root1)-1;//右子树长度
if(r)
{
string tmps1=s1.substr(l+1,r);
string tmps2=s2.substr(l+1,r);
dfs(tmps1,tmps2,root*2);
}
if(l)
{
string tmps1=s1.substr(0,l);
string tmps2=s2.substr(1,l);
dfs(tmps1,tmps2,root*2+1);
}
}
void solve()
{
dfs(s1,s2,1);
cnt--;
for(int i=1;;i++)
{
if(tree[i]>0)
{
cout << tree[i];
if(cnt--) cout << " ";
f--;
}
if(!f) break;
}
}
signed main()
{
int t=1;
while(t--)
{
init();
solve();
}
}