欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基础实验 4-2.2 列出叶结点(25 分)

程序员文章站 2022-06-07 21:09:33
...

对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

输入格式:

首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出“-”。编号间以 1 个空格分隔。

输出格式:

在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

输出样例:

4 1 5

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int node,i,flag;
struct message{
	char left,right;
	int father=-1,id,rank;
}tree[16];
void makei(int index,int id){
	tree[index].id=id;
	if(tree[index].left!='-')makei(tree[index].left-'0',id*2);
	if(tree[index].right!='-')makei(tree[index].right-'0',id*2+1);
}
int compare(message first,message second){
	return first.id<second.id;
}
int main(){
	scanf("%d",&node);
	for(i=0;i<node;i++)scanf("\n%c %c",&tree[i].left,&tree[i].right);
	for(i=0;i<node;i++){
		if(tree[i].left!='-')tree[tree[i].left-'0'].father=i;
		if(tree[i].right!='-')tree[tree[i].right-'0'].father=i;
		tree[i].rank=i;
	}
	for(i=0;i<node;i++)if(tree[i].father<0){
		makei(i,1);
		break;
	}
	sort(tree,tree+node,compare);
	for(i=0;i<node;i++)if(tree[i].left=='-'&&tree[i].right=='-'){
		if(flag)printf(" ");
		flag=1;
		printf("%d",tree[i].rank);
	}
	return 0;
}

提交结果:

基础实验 4-2.2 列出叶结点(25 分)