問題描述:
輸入每個節點的左右子節點,輸出這個樹的葉子節點,輸出順序爲從上到下,從左到右
#include <stdio.h>
#include<string.h>
typedef struct{
int date;
char right;
char left;
}tree;
tree tree1[10];
int n;
int bluidtree(tree t[],int n);
void listleaves(tree tree[],int root);
int root(tree t[],int n);
int main(){
int i,root1;
scanf("%d\n",&n);
root1=bluidtree(tree1,n);
listleaves(tree1,root1);
return 0;
}
int bluidtree(tree t[],int n){ //建立一顆二叉樹,採用結構數組的存儲結構
char a,b,c;
int i,r;
if(n==0)
return -1;
for(i=0;i<n;i++){
scanf("%c %c",&b,&c);
getchar();
t[i].date=i;
if(b=='-')
t[i].left=-1;
else
t[i].left=b-'0';
if(c=='-')
t[i].right=-1;
else
t[i].right=c-'0'; }
r=root(t,n);
return r;
}
int root(tree t[],int n){ //找到這棵樹的根
bool vis[10];
int a,b,i;
memset(vis,false,sizeof(vis));
for(i=0;i<n;i++){
a=t[i].left;
b=t[i].right;
if(a!=-1)
vis[a]=true;
if(b!=-1)
vis[b]=true;}
for(i=0;i<n;i++)
if(!vis[i])
break;
return i;
}
void listleaves(tree tree[],int root){//通過層序遍歷找出所有的葉節點,存在數組leaves裏,最後統一輸出。
int queue[10],j,k,leaves[10],i,m;
i=0;
k=0;
for(j=0;j<n;j++){
if(tree[root].left==-1&&tree[root].right==-1)
{leaves[i]=tree[root].date;
i++;}
else{
if(tree[root].left!=-1)
{
queue[k]=tree[root].left;
k=k+1;}
if(tree[root].right!=-1)
{
queue[k]=tree[root].right;
k=k+1;}
}
root=queue[j]; }
m=i;
for(i=0;i<m-1;i++)
printf("%d ",leaves[i]);
printf("%d\n",leaves[i]);
}