给定一棵树,您应该按照自上而下和从左到右的顺序列出所有叶子。
输入规格:
每个输入文件包含一个测试用例。对于每种情况,第一行给出正整数N(≤ 1 0),这是树中的节点的总数-并且因此节点编号从0到N - 1。
然后随后是 N行,每行对应一个节点,并给出节点左右子节点的索引。如果孩子不存在,将在该位置放置“ - ”。任何一对孩子都被一个空间隔开。
输出规格:
对于每个测试用例,按照自上而下和从左到右的顺序在一行中打印所有叶子的索引。任何相邻数字之间必须只有一个空格,并且该行末尾没有额外的空格。
样本输入:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
样本输出:
4 1 5
#include<cstdio>
#include<queue>
#include<cstdlib>
using namespace std;
typedef struct
{
int index;
int lchild;
int rchild;
}Node;
Node node[10];
int findRoot[10]={0};
int main()
{
int n;
scanf("%d",&n);
char ch = getchar();
for(int i =0 ;i < n; i++)
{
char left,right;
scanf("%c %c",&left,&right);
char ch = getchar();
node[i].index=i;
if(left != '-')
{
node[i].lchild = left - '0';
}
else
{
node[i].lchild = -1;
}
if(right != '-')
{
node[i].rchild = right - '0';
}
else
{
node[i].rchild = -1;
}
}
for(int i = 0; i < n; i++)
{
int child;
if(node[i].lchild != -1)
{
child = node[i].lchild;
findRoot[child] = 1;
}
if(node[i].rchild != -1)
{
child = node[i].rchild;
findRoot[child] = node[i].rchild;
}
}
int Root;
for(int i = 0; i < n; i++)
{
if(findRoot[i] == 0)
{
Root = i;
break;
}
}
int count = 0;
queue <Node> Que;
Que.push(node[Root]);
while(!Que.empty())
{
Node tempnode = Que.front();
Que.pop();
int child;
if(tempnode.lchild != -1)
{
child = tempnode.lchild;
Que.push(node[child]);
}
if(tempnode.rchild != -1)
{
child = tempnode.rchild;
Que.push(node[child]);
}
if(tempnode.lchild == -1&& tempnode.rchild == -1)
{
if(count == 0)
{
printf("%d",tempnode.index);
count = 1;
}
else
{
printf(" %d",tempnode.index);
}
}
}
return 0;
}