题目:
思路:
主要是注意中序遍历和按层遍历是什么样子的,然后再把他们转化成树。但是注意在按层找节点的左右子节点时要注意子节点在中序遍历中的区间。
代码:
#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;
}