注意建树方法, 不能像线段树一样用i<<1, i<<1|1, 因为这棵树可能不是完全二叉树, 所以会存在下标浪费。
#include<string.h>
#include<cstdio>#define MAXN 26
using namespace std;
struct Tree{
char v;
int lch, rch;//这个很重要, 不能像完全二叉树一样建树了, 极端情况有2^25的节点编号
void init(){ lch=rch=0; }
}tree[MAXN];
char s[MAXN][MAXN];
int cnt, e;
void build(int i, char c){
if (c<tree[i].v) {
if (tree[i].lch == 0){
tree[e].v=c;
tree[i].lch=e++;
}
else
build(tree[i].lch, c);
}
else {
if (tree[i].rch == 0){
tree[e].v=c;
tree[i].rch=e++;
}
else
build(tree[i].rch, c);
}
}
void tprint(int i){
printf("%c", tree[i].v);
if (tree[i].lch)
tprint(tree[i].lch);
if (tree[i].rch)
tprint(tree[i].rch);
}
int main(){
cnt=0;
while (scanf("%s", s[++cnt]) != EOF){
if (s[cnt][0]=='*' || s[cnt][0]=='$'){
for (int i=0; i<=MAXN; i++){
tree[i].init();
}
e=0;
tree[e++].v=s[cnt-1][0];
for (int i=cnt-2; i>=1; i--){
int len=strlen(s[i]);
for (int j=0; j<len; j++){
build(0, s[i][j]);
}
}
tprint(0);
printf("\n");
if(s[cnt][0] == '$') break;
cnt = 0;
}
}
return 0;
}