7-4 列表叶子

给定一棵树,您应该按自上而下的顺序列出所有叶子,从左到右。

输入规格:
每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数N (≤10), 这是树中节点的总数 – 因此节点从 0 到N−1.然后N行紧随其后,每个行对应于一个节点,并给出节点的左子级和右子级的索引。如果孩子不存在,则在该位置放置一个“-”。任何一对孩子都被一个空格隔开。

输出规格:
对于每个测试用例,按自上而下和从左到右的顺序在一行中打印所有叶子节点的索引。任何相邻数字之间必须正好有一个空格,并且行尾不能有额外的空格。
在这里插入图片描述
碎碎念:我开始想,输出叶子节点,那我输入的时候,左右都是-那不就是叶子嘛,就输出呗。显然不会有那么智障的题,这道题的考点在于从上到下从左到右顺序输出叶子。
思路来源于他人代码:我再建立一个数组(也可以再定义一个结构体,但后来我发现直接定义一个普通数组这个思路太妙了),储存我从头到脚从左到右遍历的节点(所以需要一个找到根的函数,从根开始遍历)

#include <stdio.h>
#include <stdlib.h>
#define Null -1
#define MAX 10

typedef struct Tree *tree;
struct Tree{
	int left;
	int right;
}T[MAX];

void Funtion(int root,int n);

int Judge(int );

int main()
{
	int n,i,root;
	int check[MAX]={0};
	char ll,rr;
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++){
		scanf("%c %c",&ll,&rr);
		getchar();
		if(ll=='-'){
			T[i].left = Null;
		}
		else{
			T[i].left = ll-'0';
			check[T[i].left] = 1;
		}
		if(rr=='-'){
			T[i].right  = Null;
		}
		else{
			T[i].right  = rr-'0';
			check[T[i].right] = 1;
		}
	}
	for(i=0;check[i]!=0;i++);
	root = i;
	Funtion(root,n);
	return 0;
}

void Funtion(int root,int n)
{
	int array[n-1],head=0,rear=0,flag=0;
	array[rear++] = root;
	for(;rear-head;head++){
		if(Judge(array[head])){
			if(flag) printf(" ");
			printf("%d",array[head]);
			flag = 1;
		}
		else{
			if(T[array[head]].left != Null){
				array[rear++] = T[array[head]].left ;
			}
			if(T[array[head]].right != Null){
				array[rear++] = T[array[head]].right ;
			}
		}
	}	
}

int Judge(int a)
{
	return (T[a].left ==Null&&T[a].right ==Null)?1:0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 首先,我们需要了解一下什么是7-2层次序列。7-2层次序列是指按照叉树的层次顺序,从上到下、从左到右依次给出每个结点的值,用空格隔开,空结点用字符#表示。 例如,一个叉树的7-2层次序列为:1 2 3 # # 4 5 # # # 接下来,我们可以根据7-2层次序列创建叉树。具体步骤如下: 1. 将7-2层次序列转化为一个列表,方便遍历。 2. 创建一个空的队列,将根节点入队。 3. 遍历列表,依次取出每个元素。 4. 如果队列不为空,将队首元素出队,并将其作为当前结点。 5. 如果当前元素不是空结点,创建左右子结点,并将其入队。 6. 重复步骤4-5,直到遍历完整个列表。 接下来,我们可以根据创建好的叉树,输出先序序列、中序序列、后序序列,并计算叶子结点数。具体步骤如下: 1. 先序遍历:先输出当前结点的值,再遍历左子树,最后遍历右子树。 2. 中序遍历:先遍历左子树,再输出当前结点的值,最后遍历右子树。 3. 后序遍历:先遍历左子树,再遍历右子树,最后输出当前结点的值。 4. 计算叶子结点数:如果当前结点是叶子结点(即左右子树都为空),则叶子结点数加1。 下面是具体的代码实现: ### 回答2: 叉树是一种最常用的数据结构之一,它的节点最多有两个子节点,它可以用层次序列创建并按照先序序列、中序序列、后序序列输出。在创建叉树的过程中,我们需要先确定根节点,然后按队列的方式依次向叉树中添加子节点。 例如,假设我们有一个层次序列为1,2,3,4,5,6,7的叉树,我们首先将1作为根节点,然后将2和3作为它的子节点,再将4和5作为2的子节点,6和7作为3的子节点。这样就创建了如下的叉树: 1 / \ 2 3 / \ / \ 4 5 6 7 接下来,我们可以分别按照先序序列、中序序列、后序序列输出该叉树。先序序列的输出顺序是根节点、左子树、右子树;中序序列的输出顺序是左子树、根节点、右子树;后序序列的输出顺序是左子树、右子树、根节点。在上面的叉树中,输出的先序序列是1 2 4 5 3 6 7,中序序列是4 2 5 1 6 3 7,后序序列是4 5 2 6 7 3 1。 我们还可以计算出该叉树的叶子结点数。叶子结点是指没有子节点的节点,对于上面的叉树,叶子结点是4、5、6、7,因此叶子结点数为4。 总之,按照层次序列创建叉树,并按照不同的序列方式输出和计算其属性,是数据结构中非常重要的应用之一。 ### 回答3: 7-2 层次序列创建叉树是一种基于叉树层次遍历的创建方式,它将叉树的节点从上到下、从左到右地依次排列,再根据节点的排列顺序构建出叉树。在层次序列创建叉树的过程中,需要使用队列来实现节点的入队和出队操作,以此实现逐层递进地创建叉树的目的。下面将分别讲解如何输出先序序列、中序序列、后序序列和叶子结点数。 先序序列输出: 对于叉树的先序遍历,可以按照“根节点、左子树、右子树”的顺序进行遍历输出。因此,可以使用递归的方法来实现对叉树的先序遍历。具体实现步骤如下: 1. 判断当前节点是否为空,若为空则返回。 2. 输出当前节点的值。 3. 递归输出左子树。 4. 递归输出右子树。 在层次序列创建叉树的过程中,需要将每个节点的值存储到一个数组中,然后再根据数组中的值创建出叉树。因此,我们可以先按照层次序列的方式创建出叉树,然后再使用递归的方式输出先序序列。 中序序列输出: 对于叉树的中序遍历,可以按照“左子树、根节点、右子树”的顺序进行遍历输出。与先序序列输出类似,我们可以使用递归的方法实现对叉树的中序遍历。具体实现步骤如下: 1. 判断当前节点是否为空,若为空则返回。 2. 递归输出左子树。 3. 输出当前节点的值。 4. 递归输出右子树。 与先序序列输出不同的是,在层次序列创建叉树的过程中,我们需要先确定每个节点的父节点,再确定节点的左、右子树,因此在输出中序序列时,需要使用一个栈来记录遍历过的节点。 后序序列输出: 对于叉树的后序遍历,可以按照“左子树、右子树、根节点”的顺序进行遍历输出。与先序序列输出、中序序列输出类似,我们同样可以使用递归的方法实现对叉树的后序遍历输出。具体实现步骤如下: 1. 判断当前节点是否为空,若为空则返回。 2. 递归输出左子树。 3. 递归输出右子树。 4. 输出当前节点的值。 与先序序列输出、中序序列输出不同的是,在层次序列创建叉树的过程中,我们需要使用一个指针数组记录下每个节点的左右子树,因此在输出后序序列时,需要使用两个栈来记录遍历过的节点和它们的左右子树。 叶子结点数输出: 对于叉树的叶子结点,其左、右子树均为空。因此,可以使用递归的方法统计叉树的叶子结点数。具体实现步骤如下: 1. 判断当前节点是否为空,若为空则返回0。 2. 若当前节点的左右子树均为空,则返回1。 3. 递归统计左子树的叶子结点数。 4. 递归统计右子树的叶子结点数。 5. 将左子树和右子树的叶子结点数进行相加,即为当前节点的叶子结点数。 在层次序列创建叉树的过程中,我们需要使用一个指针数组记录下每个节点的左右子树,因此在统计叶子结点数时,也需要使用这个指针数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜·肉多多·狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值