方法一:
#include<iostream>
#include<string>
#include<cstring>//不加会CE
using namespace std;
int n;
string s;
int main()
{
cin>>n;
cin>>s;
for(int i=2;i<=n;++i)//由于第一个为原串,所以单独输入
{
string ss;
cin>>ss;
int x=s.find(ss[0]);//找到这个子树的根节点在原串中的位置
s.erase(x,1);//清除根节点
s.insert(x,ss);//加入子树
}
for(int i=0;i<s.size();++i)
if(s[i]!='*') cout<<s[i];//不输出空节点
else continue;
}
方法二:
#include<iostream>
using namespace std;
struct programmer
{
char lc;
char rc;
}lt[130];
char h,h1;
void sm(char x)
{
if(x=='*') return;//如果是*说明此乃空节点,那就不用再往下探了
cout<<x;
sm(lt[x].lc);//找到他的左孩子,继续往下探(如果左孩子是*的话,会返回的,可以看上一句的上一句)
sm(lt[x].rc);//找到他的右孩子,继续向下探索
/*这里我举个例子: 例如输入abc和bcd,a的ASC码是73,所以lt[73].lc是b(ASC码74),接着再从b开始探,lt[74].lc之前有过输入,是个c。再从序
号为'c'(75)的lt数组继续往下探索,一探索到*,就会往回跑。回到c数组的rc,往回探,所以顺序问题可以保证,要是还是理解不了,可以画画试试,亲测有
效。这个函数和输入其实就是在数组的各个部分之间不断穿梭,用字符的ASC码值作为连接节点的线,数组的左右孩子就是下一个要寻找的数组的代号*/
}
int main()
{
int n;//n在题目上说了,输入几个节点
scanf("%d",&n);//为了方便大家观看,我把输入拆成三部分
cin>>h1;//输入第一个字母,第一个字母比较特殊,所以单独输入
cin>>lt[h1].lc;//左孩子,h1所代表的字符再次会转换为ASC码
cin>>lt[h1].rc;//右孩子,道理和上面相同,就不用我多费口舌了
for(int i=2;i<=n;i++)//这里大家都懂的吧,输入
{
cin>>h;
cin>>lt[h].lc;
cin>>lt[h].rc;
}
sm(h1);//进入函数,用的是递归,但我也是AC了才敢来发题解的
return 0;
}