列出叶结点
Posted i-chase
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列出叶结点相关的知识,希望对你有一定的参考价值。
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 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。
以上是关于列出叶结点的主要内容,如果未能解决你的问题,请参考以下文章