03-树1. List Leaves (25)

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

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=10) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N-1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a "-" will be put at the position. Any pair of children are separated by a space.

Output Specification:

For each test case, print in one line all the leaves' indices in the order of top down, and left to right. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.

Sample Input:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
Sample Output:
4 1 5

 

这是一个简单的二叉树,根据题目给出的结点创建一颗树,然后按层次遍历,把叶节点按顺序输出。

 

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <set>
 4 #include <queue>
 5 #include <cstring>
 6 #include <string>
 7 using namespace std;
 8 
 9 struct node //结点结构体 
10 {
11        int leftchild;  //左儿子 
12        int rightchild;  //右儿子 
13        node ()     //初始化 
14        {
15             leftchild=-1;
16             rightchild=-1;
17        }
18 };
19 node n[20];
20 bool r[20];  //记录是否是根结点 
21 queue<int> q;   //有队列遍历树 
22 int t=0;
23 
24 void traversal(int a)   //根据根节点a遍历树并且把也结点输出 
25 {
26      q.push(a);
27      while (!q.empty())
28      {
29            
30            int j=q.front();
31            //cout <<"q.pop() "<<j<<endl;
32            q.pop();
33            if (n[j].leftchild==-1&&n[j].rightchild==-1)//没有左儿子和有儿子则为叶子 
34            {
35                  if (t==0)//第一个叶节点直接输出,以后每个结点前有一个空格 
36                  {
37                       cout <<j;
38                       t=1;
39                  }
40                  else
41                  {
42                      cout <<" "<<j;
43                  
44                  }
45            }
46            if (n[j].leftchild!=-1)
47            {
48                 q.push(n[j].leftchild);  //左儿子存在,压入队列 
49            }
50            if (n[j].rightchild!=-1)
51            {
52                  q.push(n[j].rightchild);//左右子存在,压入队列
53            }
54      }
55 }
56 int main()
57 {
58     char a,b;
59     int m;
60     while (cin>>m)
61     {
62           memset(r,false,sizeof(r));
63           for (int i=0;i<m;i++)//根据输入数据构建树 
64           {
65                 cin>>a>>b;
66                 if (a>='0'&&a<='9')
67                 {
68                       n[i].leftchild=a-48;
69                       r[a-48]=true;
70                 }
71                 if (b>='0'&&b<='9')
72                 {
73                       n[i].rightchild=b-48;
74                       r[b-48]=true;
75                 }
76           }
77           for (int i=0;i<m;i++)
78           {
79               if (!r[i])
80               {
81                   traversal(i);
82                   //cout <<"i"<<i<<endl;
83                   cout <<endl;
84                   break;
85               }      
86           }
87     }
88     return 0;
89 }

 

posted @ 2015-03-26 17:06  ~Arno  阅读(436)  评论(0编辑  收藏  举报