POJ1577 树的遍历

注意建树方法, 不能像线段树一样用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值