7-15 列出叶结点分数 300作者 陈越 单位 浙江大学

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

4 1 5

 理解题目:第一行输入N,随后N行,每行输出从0到N-1的节点的左右子树,例如:

第一行输入1 - 表示第一个节点的左子树为节点数为1的节点,右子树为空节点。

第一步完成输入

typedef struct leaf
{
    int lchild=-1;
    int rchild=-1;
}leaf;//设置节点,左右子树初始化为-1;


int child[max];
leaf tree[max];
cin>>N;
    for(int i=0;i<N;i++)
    {
        char left, right;
        cin>>left>>right;//先输入char型
        if(left!='-')//左子树不为空
        {
            tree[i].lchild=left-'0';//char转化为int;
            child[count++]=tree[i].lchild;
        }
        if(right!='-')//右子树不为空
        {
            tree[i].rchild=right-'0';
            child[count++]=tree[i].rchild;
        }
    }//child[] 为所有的子树


第二步:找到根节点。

根节点为不出现在child[]中的节点,这里就不说了

第三步: 利用队列实现广度优先(bfs)。

    int front=0;//仿队列,front为队头,rear为队尾;
    int rear=1;
    int queue[max];
    queue[0]=root;//root为根节点;
    while(front!=rear)//不为空
    {
        if(tree[queue[front]].lchild!=-1)//左子树不为空将左子树放入队列。
        {
            queue[rear]=tree[queue[front]].lchild;
            rear++;
        }
        if(tree[queue[front]].rchild!=-1)
        {
            queue[rear]=tree[queue[front]].rchild;
            rear++;
        }
        front++;
    }
    int flag=0;
    for(int i=0;i<rear;i++)//输出。
    {
        if(tree[queue[i]].lchild==-1&&tree[queue[i]].rchild==-1)
        {
            if(!flag)
            {
                cout<<queue[i];
                flag=1;
            }
            else cout<<" "<<queue[i];
        }
            }

总的代码如下:

#include<iostream>
using namespace std;
#define max 11
typedef struct leaf
{
    int lchild=-1;
    int rchild=-1;
}leaf;

int main()
{
int N,count=0,track[max]={0},root;
    int child[max]={-1};
    leaf tree[max];
    int queue[max]={0};
cin>>N;
    for(int i=0;i<N;i++)
    {
        char left,right;
        cin>>left>>right;
        if(left!='-')
        {
            tree[i].lchild=left-'0';
            child[count++]=tree[i].lchild;
        }
        if(right!='-')
        {
            tree[i].rchild=right-'0';
            child[count++]=tree[i].rchild;
        }
    }//child[] 为所有的子树
    for(int i=0;i<count;i++)
    {
        track[child[i]]=-1;
    }
    for(int i=0;i<N;i++)
    {
        if(!track[i])
        {
            root=i;
        break;
        }
    }
    int front=0;
    int rear=1;
    queue[0]=root;
    while(front!=rear)
    {
        if(tree[queue[front]].lchild!=-1)
        {
            queue[rear]=tree[queue[front]].lchild;
            rear++;
        }
        if(tree[queue[front]].rchild!=-1)
        {
            queue[rear]=tree[queue[front]].rchild;
            rear++;
        }
        front++;
    }
    int flag=0;
    for(int i=0;i<rear;i++)
    {
        if(tree[queue[i]].lchild==-1&&tree[queue[i]].rchild==-1)
        {
            if(!flag)
            {
                cout<<queue[i];
                flag=1;
            }
            else cout<<" "<<queue[i];
        }
            }
    return 0;
}

第一次发文章有错误还请指正!! 

附运行结果:

 

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 出一个结点的信息。对于每个结点,如果其左子结点或右子结点存在,则在该行给出其编号(从开始)。如果不存在,则给出 −1。输入保证给出的结点信息是合法的二叉树结点信息。注意:题目保证输入的树是一棵完整的二叉树,即给出的结点总数是 2^k−1,k 为正整数。\n\n输出格式:\n按照从上到下从左到右顺序输出所有节点,每个结点占一行。 ### 回答2: 题目分析: 本题要求输出给定二叉树的所有节点。首先需要注意的是,二叉树是由结点和边构成的,结点包含左右子结点和数据域,每条边连接两个结点,形成父子关系。在二叉树的遍历过程中,有三种遍历方式:前序遍历、中序遍历和后序遍历。而题目要求按照从上到下从左到右顺序输出节点,因此本题需要采用广度优先遍历的方式。 对于广度优先遍历,可以利用队列的数据结构来实现,具体步骤如下: 1.将二叉树的根节点入队 2.当队列不为空时,依次取出队首元素 3.如果当前节点为节点,将其输出 4.否则,将其左右子节点入队 5.重复执行步骤2-4,直至队列为空 代码实现: 输入数据格式:首先输入一个正整数 n,表示二叉树结点总数。接下来按照从0到n-1的顺序依次输入每个结点的信息,包括左右子结点的编号和结点的数据域。 输出数据格式:按照从上到下从左到右顺序输出所有节点。 C++ 代码: ### 回答3: 输入格式: 本题输入格式较为特殊,需要读入多行,首先输入一个正整数n,表示二叉树中节点的总数。节点的编号从0到n-1。按照从0开始、从左到右顺序依次给出n个节点的信息。对于每个节点,输入格式也非常特殊。如果这个节点不存在,就输入-1。否则就输入节点的权值,范围在-1000到1000之间。例如,下面的输入代表了一个节点总数为7,编号从0到6的节点分别为1、3、-1、8、-1、-1、9。 ``` 7 1 3 -1 8 -1 -1 -1 9 ``` 输出格式: 输出所有节点的权值,从小到大排列。如果没有节点,则输出NULL。 思路分析: 我们可以采用层次遍历的思路,逐层搜索找到所有的节点。从根节点开始,将其加入搜索队列中。如果当前节点的两个子节点都不存在,说明它是一个节点,就将其左子节点加入结果集中。如果当前节点的左右子节点都存在,就将左右子节点都加入队列中,进行下一轮搜索。最终输出结果集即可。 Python代码实现:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月明心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值