码迷,mamicode.com
首页 > 其他好文 > 详细

PAT List Leaves

时间:2015-05-19 16:21:03      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

PAT List Leaves

Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.

PAT题目地址 PAT List Leaves

mooc上说是比较基础的树题目 必做   网上c语言代码太少 都是c++的 我这篇是纯c的 初学者可以看看

首先理解下题目意思  我感觉题意比较模棱两可

第一行 给一个N  表示总共节点数

接下来N行 每行两个数据  表示某个父节点的两个子节点  如第0个节点 1 -   表示某个父节点的两个子节点为 1 和NULL 注意1代表的是节点序号  

再比如第二个节点 0 -  那么这个节点就是第0个节点的父节点

 

然后我们要做的就是找出根节点  这个比较容易找 就是左右节点都没有出现过的序号 则是根节点  可以弄一个flag数组来标记一下

 

最后就是用一个队列来储存所有的节点  然后按层次检索每个节点  左右儿子为空则是叶节点 

我的代码写的可能有点简陋 还能在优化

下面是AC代码

 1 #include "stdio.h"
 2 typedef struct 
 3 {
 4     int left;
 5     int right;
 6 }Tree;
 7 int main()
 8 {
 9     int n,i,j,root,cnt=0,k=1,flag1=0;
10     Tree tree[10];
11     int flag[10]={0};
12     char l,r;
13     int queue[30];
14     scanf("%d",&n);
15     for(i=0;i<n;i++)
16     {
17         scanf(" %c %c",&l,&r);            
18         if(l==-)
19             tree[i].left=-1;            //若输入为-  则为NULL 用-1表示 
20         else
21         {
22             tree[i].left=l-0;            
23             flag[l-0]=1;                //表示这个节点已经出现过 
24         }
25         if(r==-)
26             tree[i].right=-1;
27         else
28         {
29             tree[i].right=r-0;
30             flag[r-0]=1;
31         }    
32                 
33     }
34     for(i=0;i<8;i++)
35     {
36         if(flag[i]==0)                //找出根节点 
37         {    
38             root=i;
39             break;    
40         }    
41     }
42     queue[0]=root;
43     i=1;
44     while(cnt<=n-1)                    //cnt 表示实际节点数 也就是不为NULL的节点 
45     {
46         if(root !=-1)
47         {
48             queue[i++]=tree[root].left;            //入队操作 这段代码建议调试看看数据才能明白 
49             queue[i++]=tree[root].right;            
50             cnt++;            
51         }
52         else
53             queue[i]=-1;
54         root=queue[k++];
55         
56             
57     }
58     
59     for(j=0;j<i;j++)
60     {
61         if(queue[j]!=-1)
62         {
63             if(tree[queue[j]].left==-1 &&tree[queue[j]].right==-1 && flag1==1)
64                 printf(" %d",queue[j]);    
65             if(tree[queue[j]].left==-1 &&tree[queue[j]].right==-1 &&flag1==0)
66             {
67                 printf("%d",queue[j]);
68                 flag1=1;
69             }
70                 
71         }    
72     }
73     
74 }

 

PAT List Leaves

标签:

原文地址:http://www.cnblogs.com/threezj/p/4514784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!