列出叶结点

对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

输入格式:

首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。

输出格式:

在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
 

输出样例:

4 1 5
 
 
 1 #include <iostream>
 2 #include <queue>
 3 #include <vector>
 4 #include <cstring>
 5 #define MAXSIZE 10
 6 using namespace std;
 7 
 8 struct TreeNode {
 9     char data;
10     int cl;
11     int cr;
12 } t[MAXSIZE];
13 queue<int> q;
14 vector<int> v;
15 int CreateTree(struct TreeNode t[]) {
16     int N, root;
17     cin >> N;
18     if(!N) return -1;
19     int check[N];//用来标记该结点是否有父节点
20     memset(check, 0, sizeof(check));
21     for(int i=0; i<N; ++i) {
22         t[i].data=i+'0';
23         char tcl, tcr;
24         cin >> tcl >> tcr;
25         if(tcl!='-') {
26             t[i].cl = tcl-'0';
27             check[t[i].cl] = 1;
28         }
29         else t[i].cl = -1;
30         if(tcr!='-') {
31             t[i].cr = tcr-'0';
32             check[t[i].cr] = 1;
33         }
34         else t[i].cr = -1;
35     }
36     int index;
37     for(index=0; index<N; index++) {
38         if(!check[index]) break;//没有父结点则为根结点
39     }
40     root = index;
41     return root;
42 }
43 void bfs(){
44     for(int i=0;i<q.size();i++){
45         int temp=q.front();
46         q.pop();
47         if(t[temp].cl==-1 && t[temp].cr==-1)
48             v.push_back(temp);
49         if(t[temp].cl!=-1)
50             q.push(t[temp].cl);
51         if(t[temp].cr!=-1)
52             q.push(t[temp].cr);    
53     }
54     if(q.size()) bfs();
55 }
56 int main(){
57     int r=CreateTree(t);
58     q.push(r);
59     bfs();
60     for(auto it=v.begin();it!=v.end();it++){
61         if(it!=v.begin())
62             cout << " ";
63         cout << *it;
64     }
65     cout << endl;
66 }

解析:1、创建结构体并生成树;   2、找到树的根结点并放进队列,然后利用广度优先遍历将叶子结点放进vector,将非叶子结点放进queue,运用递归应用到整个结构体数组;   3、打印vector。

猜你喜欢

转载自www.cnblogs.com/i-chase/p/13195832.html