外站题目求助
  • 板块学术版
  • 楼主CurryNo_1
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/23 21:55
  • 上次更新2024/3/24 01:11:00
查看原帖
外站题目求助
828573
CurryNo_1楼主2024/3/23 21:55

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();
	}
}

2024/3/23 21:55
加载中...