二叉树(2)

Time Limit:1000MS  Memory Limit:65536K
Total Submit:82 Accepted:37

Description

1、 按扩展的先序序列(即包括空结点,1表示空结点)输入二叉树的各结点,建立二叉树,


输出包括两行,第一行为该二叉树的高度,第二行按自左至右的顺序输出所有叶子结点,各字符后有一空格

Input

输入有多组实例,每组实例占一行

Output

每组结果占两行,第一行为该二叉树的高度,第二行按自左至右的顺序输出所有叶子结点,各字符后有一空格

Sample Input

ABD111CE11F11

Sample Output

3
D E F

Source

为了输出叶子,实在费了不少劲,理解来理解去的,收获是什么,收获了抗打击能力和对煎熬的承受能力,有时候就是找不到那一点错误,就只能在那郁闷,,或许也有这样一种说法,时间久了总会有想法的,于是有时候就出来一些看似笨笨的小技巧,往下看:


方法一:
#include<stdio.h>
#include
<stdlib.h>
char str[1000];
char str1[1000];
int i,d;
typedef
struct Tnode
{
char data;
struct Tnode *lchild,*rchild;
}Tnode,
*Tree;
int m=sizeof(Tnode);
Tree newnode()
{
Tree p;
p
=(Tree)malloc(m);
p
->lchild=NULL;
p
->rchild=NULL;
return p;
}
void Creat(Tree p)
{
Tree s,q;
if(str[i]=='1')
{
p
->data='1';
return;
}
else
{
p
->data=str[i];
s
=newnode();
p
->lchild=s;
i
++;
Creat(s);
}
q
=newnode();
p
->rchild=q;
i
++;
Creat(q);
}
int depth(Tree p)
{
if(!p) return 0;
int d1= depth(p->lchild);
int d2= depth(p->rchild);
return d=(d1>d2?d1:d2)+1;
}
/*void in(Tree p)
{
if(p!=NULL)
{
in(p->lchild);
if(p->lchild->data=='1'&&p->rchild->data=='1')
printf("%c ",p->data);
in(p->rchild);
}
}
*/
int main()
{
Tree t;
int j,k;
while(gets(str))
{
i
=0;j=0;
for(i=0;str[i]!='\0';i++)
if(str[i]=='1'&&str[i+1]=='1'&&str[i-1]!='1')
str1[j
++]=str[i-1];
i
=0;
t
=newnode();
Creat(t);
depth(t);
printf(
"%d\n",d-1);
//in(t);
for(k=0;k<j;k++)
printf(
"%c ",str1[k]);
printf(
"\n");
}
return 0;
}
方法二:
#include<stdio.h>
#include
<stdlib.h>
char str[1000];
int i,d,top,max;
typedef
struct Tnode
{
char data;
struct Tnode *lchild,*rchild;
}Tnode,
*Tree;
int m=sizeof(Tnode);
Tree newnode()
{
Tree p;
p
=(Tree)malloc(m);
p
->lchild=NULL;
p
->rchild=NULL;
return p;
}
void Creat(Tree p)
{
Tree s,q;
if(str[i]=='1')
{
p
->data='1';
return;
}
else
{
p
->data=str[i];
s
=newnode();
p
->lchild=s;
i
++;
Creat(s);
}
q
=newnode();
p
->rchild=q;
i
++;
Creat(q);
}
/*int depth(Tree t)
{
if(!t) return 0;
int d1= depth(t->lchild);
int d2= depth(t->rchild);
return d=(d1>d2?d1:d2)+1;
}
void in(Tree t)
{
if(t!=NULL){
in(t->lchild);
if(t->lchild->data=='1'&&t->rchild->data=='1')
printf("%c",t->data);
in(t->rchild);
}
}
*/
void look(Tree p,int i)
{
if(p->data!='1')
{
i
++;
if(max<i)
max
=i;
if(p->lchild->data=='1'&&p->rchild->data=='1')
str[top
++]=p->data;
}
else return;
look(p
->lchild,i);
look(p
->rchild,i);
}
int main()
{
Tree t;
int j;
while(gets(str))
{
i
=0;
t
=newnode();
Creat(t);
//depth(t);
//printf("%d\n",d-1);
/*top=0;max=0;
in(t);
*/
max
=0;top=0;
look(t,
0);
printf(
"%d\n%c",max,str[0]);
for(j=1;j<top;j++)
printf(
" %c",str[j]);
printf(
"\n");
}
return 0;
}

  

  

posted on 2011-07-23 09:35  world_ding  阅读(262)  评论(0编辑  收藏  举报