03-樹2 List Leaves (25分)

問題描述:
輸入每個節點的左右子節點,輸出這個樹的葉子節點,輸出順序爲從上到下,從左到右


#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]);
  
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章