对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶结点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶结点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
#include<stdio.h>
#include<math.h>
typedef struct Tree
{
char left;
char right;
}tree;
int Findroot(int* st,int n)
{
for(int i=0;i<n;i++)
{
if(st[i]!=1)return i;
}
return -1;
}
int max=0;
void identify(int n,int *number,tree* T)
{
int x=number[n];
int l=-1,r=-1;
if(T[x].left!='-')
{
l=T[x].left-'0';
number[n*2]=l;
}
else
{
number[n*2]=-1;
}
if(T[x].right!='-')
{
r=T[x].right-'0';
number[n*2+1]=r;
}
else number[n*2+1]=-1;
if(l!=-1)
identify(n*2,number,T);
if(r!=-1)
identify(n*2+1,number,T);
max=max>n*2+1? max:n*2+1;
return;
}
void findleaf(tree* T,int N,int sum,int* number)
{
int flag=0;
for(int i=1;i<=max;i++){
int x=number[i];
if(x==-1)continue;
//else if(x>=N||x<0)break;
else if(T[x].left=='-'&&T[x].right=='-')
{
if(flag==1)printf(" ");
printf("%d",x);
flag=1;
}
}
return;
}
int main()
{
int N;
scanf("%d",&N);
int st[15]={0};//用于查找根节点
int sum=pow(2,N);
int number[sum];
getchar();
tree T[N];
int root;
for(int i=0;i<N;i++)
{
scanf("%c",&T[i].left);
getchar();
scanf("%c",&T[i].right);
getchar();
if(T[i].left!='-')
{
int son=T[i].left-'0';
st[son]=1;
}
if(T[i].right!='-')
{
int son=T[i].right-'0';
st[son]=1;
}
}
root=Findroot(st,N);
for(int i=0;i<sum;i++)number[i]=-1;
//printf("%d\n",root);
number[1]=root;
identify(1,number,T);
findleaf(T,N,sum,number);
return 0;
}