二叉树(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;
}