1. 实战7.4HDU1710-由先序和中序序列产生后序序列

希冀平台:
代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<cmath>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
#include<set>
typedef long long ll;
using namespace std;
const int N = 2e5 + 10;
int alst[N], blst[N];
void gj(int l, int r,int lnow,int rnow, map<int, int>hxid)
//l:alst的左边界,r:alst的右边界
//lnow:blst的左边界,rnow:blst的右边界,hxid:查找
{
	if (l >= r) { cout << alst[l] << ' '; return; }
	if(lnow < hxid[alst[l]] and hxid[alst[l]]<rnow)//既有左子树又有右子树
	{
		gj(l + 1, l + hxid[alst[l]] - lnow, lnow, hxid[alst[l]] - 1, hxid);
		gj(l + hxid[alst[l]] - lnow + 1, r, hxid[alst[l]] + 1, rnow, hxid);
	}
	else if (hxid[alst[l]] >= rnow)//只有左子树
	{
		gj(l + 1, l + hxid[alst[l]] - lnow, lnow, hxid[alst[l]] - 1, hxid);
	}
	else if (hxid[alst[l]] <= lnow)//只有右子树
	{
		gj(l + hxid[alst[l]] - lnow + 1, r, hxid[alst[l]] + 1, rnow, hxid);
	}
	cout << alst[l] << ' ';
	return;
}
int main()
{
	freopen("in.txt", "r", stdin);
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int n; cin >> n;
	for (int i = 0; i < n; i++)cin >> alst[i];
	map<int, int>hxid;
	for (int i = 0; i < n; i++) { cin >> blst[i]; hxid[blst[i]] = i; }
	gj(0, n - 1, 0, n - 1, hxid);


	return 0;
}

posted on 2024-05-07 11:46  WHUStar  阅读(11)  评论(0编辑  收藏  举报