给定一棵树,您应该按自上而下的顺序列出所有叶子,从左到右。
输入规格:
每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数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;
}