对二叉树理解(二)的多组处理,深度和最底端叶子输出

本文详细介绍了如何根据扩展的先序序列构建二叉树,并实现二叉树的高度计算及叶子节点的输出。通过两种不同的方法展示了二叉树的创建过程,以及如何有效地遍历并找出所有叶子节点。

二叉树(2)

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

Description

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

1210.jpg


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

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;
}

  

  

转载于:https://www.cnblogs.com/world-ding/articles/2114616.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值