03-树2 List Leaves(25 分)

题意:按层次输出叶子节点

思路:由于数据都是小于10的整数,所以可以用数组存储二叉树,层次遍历二叉树则需要一个队列存储每一层的节点。遇到叶子节点就输出。

#include<stdio.h>
struct node{   //数组用来存储二叉树 
	int data;
	int left;
	int right;
}tr[10];

int main()
{
	int N,i,M=0;
	int check[10]={0};
	scanf("%d",&N);
	getchar();                         //读入换行符 
	for(i=0;i<N;i++){
		char l,r;
	    scanf("%c %c",&l,&r);        //读入左右孩子 
	    getchar();
	    if(l=='-'&&r=='-')M++;        //叶子节点个数 
	    tr[i].data=i;                  //节点数据 
	    tr[i].left=l=='-'?-1:l-'0';    
	    tr[i].right=r=='-'?-1:r-'0'; 
	    if(l!='-')check[l-'0']=1;     //查找根节点 
	    if(r!='-')check[r-'0']=1;
	}
	int queue[10]={0},rear=-1,front=-1;   //设置队列,按层次输出 
	struct node p;
	for(i=0;i<N;i++)         //根节点 
	{
	    if(check[i]==0)queue[++rear]=i;    //队尾插入根节点 
	}
	while(front!=rear){                       //队列不为空 
		p=tr[queue[++front]];                 //队头取出节点 
		if(p.left!=-1)queue[++rear]=p.left;   //队尾插入左孩子
		if(p.right!=-1)queue[++rear]=p.right; //队尾插入右孩子 
		if(p.left==-1&&p.right==-1){          //输出叶子节点 
		    printf("%d",p.data);
		    M--;
		    if(M)printf(" ");
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值