对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
1. 8 2. 1 - 3. - - 4. 0 - 5. 2 7 6. - - 7. - - 8. 5 - 9. 4 6
结尾无空行
输出样例:
4 1 5
思路:用一个结构体存树,然后 每个孩子节点标记一下,没有标记的就是根结点,使用一个队列从树根开始遍历,遍历到没有左右子树的结点就直接输出
#include<bits/stdc++.h> using namespace std; struct node{ int left,right; }s[20]; int vis[20]; int main() { int n; cin>>n; for(int i=0;i<n;i++) { char x,y; cin>>x>>y; if(x=='-') s[i].left=-1; else { s[i].left=x-'0'; vis[x-'0']=1; } if(y=='-') s[i].right=-1; else { s[i].right=y-'0'; vis[y-'0']=1; } } int root; for(int i=0;i<n;i++) if(!vis[i]) root=i; queue<int>q; q.push(root); int f=0; while(!q.empty()) { int x=q.front(); q.pop(); if(s[x].left==-1&&s[x].right==-1) { if(f++) cout<<' '; cout<<x; } if(s[x].left!=-1) q.push(s[x].left); if(s[x].right!=-1) q.push(s[x].right); } return 0; }