GZMU集训队每日一题(第十一次)

题目:

 

思路:

        主要是注意中序遍历和按层遍历是什么样子的,然后再把他们转化成树。但是注意在按层找节点的左右子节点时要注意子节点在中序遍历中的区间。

代码:

#include<iostream>
//#include<bits/stdc++.h>
#include<map>
using  namespace std;
string zhong, ceng;
	


struct tree {
	char lift;
	char right;
	char last;
	int the_id;
	int last_id;
	int rr;
	int ll;
	
};
map<char, tree>tr;
void outt(char ch)
{
	cout << ch;
	if (tr[ch].lift!='0')outt(tr[ch].lift);
	if (tr[ch].right!='0')outt(tr[ch].right);
}
int main()
{
	cin >> zhong >> ceng;
	
	int k = 1;
	for (int i = 0; i < ceng.size(); i++)
	{
		int id = 0;int l, r;
		
		for (int j = 0; j < zhong.size(); j++)
		{
			if (zhong[j] == ceng[i]) { id = j; break; }
		}
		
		tr[ceng[i]].the_id = id;
		if (i != 0)tr[ceng[i]].last_id = tr[tr[ceng[i]].last].the_id;
		if (i == 0) {
			tr[ceng[i]].ll = 0;
			tr[ceng[i]].rr = ceng.size() - 1;
		}

		//左边
		l = tr[ceng[i]].ll;
		r = id - 1;
		int pd1 = 0;
		for (int j = l; j <= r; j++)
		{
			if (ceng[k] == zhong[j])
			{
				tr[ceng[i]].lift = ceng[k++];
			//if(i!=0)
				tr[zhong[j]].last = ceng[i];
				tr[zhong[j]].ll = l;
				tr[zhong[j]].rr = r;
				pd1 = 1;
				break;
			}
		}
		if(pd1==0)tr[ceng[i]].lift = '0';
		//右边
		l = id + 1;
		r = tr[ceng[i]].rr;
		int pd2 = 0;
		for (int j = l; j <= r; j++)
		{
			if (ceng[k] == zhong[j]) 
			{
				tr[ceng[i]].right = ceng[k++]; 
				tr[zhong[j]].last = ceng[i];
				tr[zhong[j]].ll = l;
				tr[zhong[j]].rr = r;
				pd2 = 1;
				break;
			}
		}
		if(pd2==0)tr[ceng[i]].right = '0';
		//cout << ceng[i] << " l:" << tr[ceng[i]].lift << " r:" << tr[ceng[i]].right << endl;
	}
	outt(ceng[0]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值