pta-7-40 列出叶结点 (25分)
题目
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-“。编号间以 1 个空格分隔。
输出格式
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
1 2 3 4 5 6 7 8 9
| 8 1 - - - 0 - 2 7 - - - - 5 - 4 6
|
输出样例:
![我师傅灵魂画师](1jpg %}
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<bits/stdc++.h> using namespace std; struct fun{ char Left,Right; }p[20]; int Root[20]={0}; vector<int> leaf[20]; void func(int s,int cur){ if(p[s].Left=='-'&&p[s].Right=='-'){ leaf[cur].push_back(s); return; } if(p[s].Left!='-') func(p[s].Left-'0',cur+1); if(p[s].Right!='-') func(p[s].Right-'0',cur+1); } int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ cin>>p[i].Left>>p[i].Right; Root[p[i].Left-'0']=1; Root[p[i].Right-'0']=1; } int ri; for(int i=0;i<n;i++){ if(!Root[i]){ ri=i; break; } } func(ri,1); int flag=0; for(int i=1;i<=n;i++){ for(int j=0;j<leaf[i].size();j++){ if(!flag){ flag=1; } else{ cout<<" "; } cout<<leaf[i][j]; } } return 0; }
|