(c语言详解)03-树2 List Leaves

非常开心能写下这篇博文,如果大家正好看到这篇博文时,希望大家跟我有一样困惑,这破题,到底是怎么做的?pta(破题啊)
出于礼貌性还是把题目放出来
在这里插入图片描述
题目说的很明白
For each test case, print in one line all the leaves’ indices in the order of top down, and left to right. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.
至上而下,由左到右输出这些叶子。

叶子

何唯叶子?
在这里插入图片描述
左孩子和右孩子都没有的,称为叶子。那么了解了之后,继续下面的

存储树

很显然我们将由结构体模拟树也就是

struct node{
	int data;
	int left;
	int right;
};

为什么?看输入,开局先输入结点个数,然后依次输入左孩子右孩子。结点就是你输入的第几个,你输入2 3。也就是左孩子是第二个输入的结点,右孩子是第三个输入的结点,-用没有孩子来表示咯。

根节点

用mooc老师讲的,哨兵去监视根节点到底在哪里。

如何规律输出

用一个长度为输入结点个数的数组模拟队列一个个去入队出队,获得程序最佳输出。

总结

用翁恺老师话来说,程序包含“输入–处理–输出”,输入我们先用N来指定根结点,然后用结构体来模拟左右孩子,用哨兵去摸出根节点,用根节点去遍历整棵树。希望大家真的要把队列这个小妖精给抓住,数组模拟队列,数组模拟堆栈,在程序中输出,可以玩出花样繁翻的功能呢!

  • 程序输入N
  • 程序读入左右孩子,哨兵循环
  • 入队根节点,左右孩子判断再入队
  • 没有左右孩子然后输出

程序源码

#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();//输入回车,getchar代替
	for(i=0;i<N;i++)
	{
		char l,r;
		scanf("%c %c",&l,&r);
		getchar();//输入回车,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;
}

版权声明:本文为m0_37149062原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。