POJ1577 树的遍历

来源:互联网 发布:彩票控 知乎 编辑:程序博客网 时间:2024/06/07 18:43

注意建树方法, 不能像线段树一样用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;
}