c++二叉树BFS3题解(爱思创)

本文介绍了如何利用广度优先搜索(BFS)解决输入一串二叉树并输出BFS序列的问题。首先,文章解释了BFS的基本概念和在二叉树中的应用。接着,提供了详细的代码实现,包括二叉树结构的定义、BFS函数以及寻找根节点的过程。最后,展示了样例输入和输出,代码成功通过样例测试。
摘要由CSDN通过智能技术生成

前言:

 

这篇文章是为了帮助一些

像我这样的菜鸟

找到简单的题解

问题描述:

题目描述

输入一串二叉树,对其从根结点开始进行 BFS,输出 BFS 序。

输入格式

第一行为二叉树的节点数n (1≤n≤26)。

后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。

空节点用 * 表示。

说明:

  • 不保证第一个节点是根结点
  • 不保证 n 个结点的编号就是前 n 个小写字母

输出格式

输出共 n 行,每行一个字母,为二叉树的 BFS 序。

样例输入

6
abc
bdi
cj*
d**
i**
j**

样例输出

a
b
c
d
i
j

问题解析:

这道题需要用到BFS(广度优先搜索)和二叉树


广度优先搜索介绍:

广度优先搜索(也称宽度优先搜索,缩写BFS)

是连通图的一种遍历策略。因为它的思想是从一个顶点开始,辐射状地优先遍历其周围较广的区域,因此得名。

一般可以用它做走迷宫,从起点开始,找出到终点的最短路程,很多最短路径算法就是基于广度优先的思想成立的。

当然这是迷宫问题

二叉树也可以BFS

BFS:相关资料

重点:BFS需要使用队列

二叉树介绍:

关于二叉树需要讲的太多了

我找到了相关资料

二叉树:相关资料


本题直接创建二叉树

再BFS(同时输出BFS的入队信息)

题目代码:

第一部写变量

本题变量非常多有二叉树、队列、一些输入输出的变量

struct node
{
    char z,data,left,right;//分别表示父节点 自身 左孩子 右孩子
}a[10000001];//也可以开小点
queue<char> q;//BFS队列
int sum;//输入次数
char f,x,b,c,root;//各种变量

然后写BFS部分

void bfs(char r)//树的根节点题目说不保证第一个输入的为根
{
	q.push(r);//入队
    while(!q.empty())//判断是否为空
    {
        char n=q.front();//定义临时变量
		cout<<n<<endl;//输出当前队首名称
		q.pop();//队首出队
        if(a[n].left !='*')//判断左孩子入队
        {
            q.push(a[n].left);
        }
        if(a[n].right !='*')//判断右孩子入队
        {
            q.push(a[n].right);
        }
    }
    return;
}

接下来是主函数和寻找树的根部分

int main()
{
    cin>>sum;//输入个数
    for(int i=1;i<=sum;i++)
    {
    	cin>>x;//输入当前节点
    	a[x].data=x;//当前节点存储
		cin>>a[x].left;//读入左孩子
		cin>>a[x].right;//读入右孩子
		if(a[x].left!='*') a[a[x].left].z=x;//把左孩子的父亲设为当前节点X
		if(a[x].right!='*') a[a[x].right].z=x;//把右孩子的父亲设为当前节点X
    }
    root=x;//树的根存储为最后一个孩子
    while(a[root].z!='\0')//判断是否有父亲
    {
    	root=a[root].z;//查找父亲的父亲
	}
	bfs(root);//bfs根
    return 0;
}

完整代码:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    char z,data,left,right;//分别表示父节点 自身 左孩子 右孩子
}a[10000001];//也可以开小点
queue<char> q;//BFS队列
int sum;//输入次数
char f,x,b,c,root;//各种变量
void bfs(char r)//树的根节点题目说不保证第一个输入的为根
{
	q.push(r);//入队
    while(!q.empty())//判断是否为空
    {
        char n=q.front();//定义临时变量
		cout<<n<<endl;//输出当前队首名称
		q.pop();//队首出队
        if(a[n].left !='*')//判断左孩子入队
        {
            q.push(a[n].left);
        }
        if(a[n].right !='*')//判断右孩子入队
        {
            q.push(a[n].right);
        }
    }
    return;
}
int main()
{
    cin>>sum;//输入个数
    for(int i=1;i<=sum;i++)
    {
    	cin>>x;//输入当前节点
    	a[x].data=x;//当前节点存储
		cin>>a[x].left;//读入左孩子
		cin>>a[x].right;//读入右孩子
		if(a[x].left!='*') a[a[x].left].z=x;//把左孩子的父亲设为当前节点X
		if(a[x].right!='*') a[a[x].right].z=x;//把右孩子的父亲设为当前节点X
    }
    root=x;//树的根存储为最后一个孩子
    while(a[root].z!='\0')//判断是否有父亲
    {
    	root=a[root].z;//查找父亲的父亲
	}
	bfs(root);//bfs根
    return 0;
}

题目测评:

样例通过 

成功AC 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值