7-25 列出叶结点 (25 分)

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

4 1 5

题目分析:由于题目要求从上到下,从左到右依次输出叶子节点,故想到树的层次遍历,可以实现这样的顺序输出。首次需要找出遍历的根节点,设置一个标志数组,若在输入数字中未出现过,说明是根节点,其次还要考虑给定数据的存储形式,采用树的结构体存储。

题目解答:

#include<bits/stdc++.h>
#include<queue>
using namespace std;
struct node{
    int left;
    int right;
}a[11];
int check[15];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        char s1,s2;
        cin>>s1>>s2;
        if(s1!='-'){
            a[i].left=s1-'0';
            check[a[i].left]=1;
        }else a[i].left=-1;
        if(s2!='-'){
            a[i].right=s2-'0';
            check[a[i].right]=1;
        }else a[i].right=-1;
    }
    int pos;
    for(int i=0;i<n;i++){
        if(check[i]!=1){
             pos=i;//说明是根节点
        }
    }
    queue<int> q;
    q.push(pos);
    vector<int> v;
    while(!q.empty()){
        int t=q.front();
        q.pop();
        if(a[t].left==-1&&a[t].right==-1){
            v.push_back(t);
        }
        if(a[t].left!=-1) q.push(a[t].left);
        if(a[t].right!=-1) q.push(a[t].right);
    }
    for(int i=0;i<(int)v.size();i++){
        if(i)
        cout<<" "<<v[i];
        else cout<<v[i];
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞飞鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值