【小浩算法 cpp题解】层次遍历与BFS

embedded/2024/10/22 16:52:08/

层次遍历与BFS

  • 前言
  • 我的思路
    • 思路一:队列
    • 思路二 递归
  • 我的代码
    • 运行结果

前言

二叉树的层次遍历应该是数据结构里面最基础的算法了,比较容易想到的就是用队列,刚好C++的模板库里面也有queue这个数据结构,入队出队已经给我们实现好了,不然像C语言那样我估计会很烦躁哈哈哈哈。不过在学习了一下算法思路之后,我用了两种方法去实现:队列和递归。

我的思路

思路一:队列

队列真的没什么好说,首先把树的根节点入队,如果队列不为空,就弹出(输出)队首结点,然后把这个结点的左右孩子都入队。

void BreadthFirstSearch(node* root) {queue<node> myTree;if (root != nullptr) {myTree.push(*root);}while (!myTree.empty()) {cout << myTree.front().info << ' ';if (myTree.front().left != nullptr) {myTree.push(*(myTree.front().left));}if (myTree.front().right != nullptr) {myTree.push(*(myTree.front().right));}myTree.pop();}}

思路二 递归

其实这个思路的大体内容是不难的。整体来看,层次遍历也就是一层一层地输出,所以我们可以把二叉树存入一个二维数组里面每一层都是这个二维数组的二级元素
至于如何实现这个存储的过程,其实就需要用到BFS的思想,我们可以把层数和这个二维数组的一级元素给对应起来,比如我第一层就存储第一行数组,第二层就存储到第二行数组,依次类推。根据BFS递归的思想,每一个结点的孩子的层数都是该节点的层数+1。因此我们就很容易写出代码了。

//用于BFS递归的主函数void BFS_Recursion(node* root, int level, vector<vector<char>>& res) {if (root == nullptr) {return;}if (res.size() < level) {res.push_back(vector<char>());}res[level - 1].push_back(root->info);BFS_Recursion(root->left, level + 1, res);BFS_Recursion(root->right, level + 1, res);}void BreadthFirstSearch_recursion(node* root) {vector<vector<char>> res;BFS_Recursion(root, 1, res);for (int i = 0; i < res.size(); i++) {for (int j = 0; j < res[i].size(); j++) {cout << res[i][j] << " ";}}}

我的代码

以下是全部代码:

#include <iostream>
#include<algorithm>
#include<cmath>
#include <queue> 
using namespace std;struct node {char info;node* left;node* right;node(char data) :info(data), left(nullptr), right(nullptr) {};node() :info(NULL), left(nullptr), right(nullptr) {};
};class binaryTree {
private:node* root;
public:binaryTree() {root = new node(NULL);}//得到树的根结点node* getRoot() {return root;}//以递归的方式构建一棵树void createTree(node*& t) {char str;cin >> str;if (str == '#') {t = NULL;}else {t = new node;//为t开辟空间t->info = str;createTree(t->left);createTree(t->right);}}//树的深度int depth(node* root) {if (root == nullptr) {return 0;}int left = depth(root->left);int right = depth(root->right);return max(left, right) + 1;}//打印一棵树满二叉树,只能打印满二叉树,节点数目最好不要超过10void print(node*& root) {//存放打印的二叉树char str[10][100] = {};queue<node*> q;int h = depth(root);q.push(root);int index = 0;while (!q.empty()) {int size = q.size();//存放每一层的节点vector<char> list;for (int i = 0; i < size; i++) {node* temp = q.front();q.pop();list.push_back(temp->info);//cout << temp->info;if (temp->left != nullptr) {q.push(temp->left);}if (temp->right != nullptr) {q.push(temp->right);}}bool flag = true;int j = 0;//打印前面部分空白while (j <= 2 * h - 1 - index) {str[index][j] = ' ';j++;}//保持第一行居中if (index == 0) {for (int m = 0; m < h - 2; m++) {str[index][j++] = ' ';}}for (int k = 0; k < list.size(); k++) {//如果是一层最后一个节点if (k == list.size() - 1) {str[index][j++] = list[k];}else {//相邻左右子节点if (k % 2 == 0) {str[index][j++] = list[k];for (int l = 0; l < 3 + 2 * (h - index / 2 - 1); l++) {str[index][j++] = ' ';}}else {str[index][j++] = list[k];str[index][j++] = ' ';}}}index += 2;//cout << endl;}for (int i = 0; i < 10; i++) {if (i % 2 == 1) {for (int j = 0; j < 100; j++) {str[i][j] = ' ';}}}for (int i = 0; i < 10; i++) {if (i % 2 == 0) {for (int j = 0; j < 100; j++) {if (str[i][j] - '0' >= 0 && str[i][j] - '0' <= 9 && i < 2 * h - 2) {str[i + 1][j - 1] = '/';str[i + 1][j + 1] = '\\';}}}}for (int i = 0; i < 10; i++) {for (int j = 0; j < 100; j++) {cout << str[i][j];}cout << endl;}}void DeepFirstSearch(node* root) {if (root == NULL) {return;}else {cout << root->info << ' ';DeepFirstSearch(root->left);DeepFirstSearch(root->right);}}void BreadthFirstSearch(node* root) {queue<node> myTree;if (root != nullptr) {myTree.push(*root);}while (!myTree.empty()) {cout << myTree.front().info << ' ';if (myTree.front().left != nullptr) {myTree.push(*(myTree.front().left));}if (myTree.front().right != nullptr) {myTree.push(*(myTree.front().right));}myTree.pop();}}//用于BFS递归的主函数void BFS_Recursion(node* root, int level, vector<vector<char>>& res) {if (root == nullptr) {return;}if (res.size() < level) {res.push_back(vector<char>());}res[level - 1].push_back(root->info);BFS_Recursion(root->left, level + 1, res);BFS_Recursion(root->right, level + 1, res);}void BreadthFirstSearch_recursion(node* root) {vector<vector<char>> res;BFS_Recursion(root, 1, res);for (int i = 0; i < res.size(); i++) {for (int j = 0; j < res[i].size(); j++) {cout << res[i][j] << " ";}}}
};int main() {binaryTree T;node* root = T.getRoot();T.createTree(root);cout << "树的深度:" << T.depth(root) << endl;T.print(root);cout << "\n===========DFS recursion====================" << endl;T.DeepFirstSearch(root);cout << "\n===========BFS QUEUE====================" << endl;T.BreadthFirstSearch(root);cout << "\n===========BFS recursion====================" << endl;T.BreadthFirstSearch_recursion(root);return 0;
}

运行结果

在这里插入图片描述


http://www.ppmy.cn/embedded/33624.html

相关文章

深入探索 MySQL:成本模型解析与查询性能优化

MySQL作为最流行的关系型数据库管理系统之一&#xff0c;在各种应用场景中都有着广泛的应用。 然而&#xff0c;在处理大规模数据时&#xff0c;查询性能往往成为了关注焦点。 本文将深入探讨MySQL的成本模型&#xff0c;解析其工作原理&#xff0c;并提供一系列优化策略&…

RabbitMQ之延迟队列

为什么要有延迟队列&#xff1f; 延迟消息就是指当消息被发送以后&#xff0c;并不想让消费者立即拿到消息&#xff0c;而是等待指定时间后&#xff0c;消费者才拿到这个消息进行消费。 使用场景&#xff1a; 短信通知&#xff1a;下单成功后60s之后给用户发送短信通知。 失败重…

MySQL纪录慢SQL

查看慢SQL是否启用&#xff0c;查看命令&#xff1a;show variables like ‘log_slow_queries’ 查看慢查询参数&#xff0c;即设置超过多少秒的查询归为了慢查询。参数为&#xff1a;long_query_time 查询命令&#xff1a; show global variables like ‘long_query_time’; …

【Linux线程】

目录 线程是操作系统的一个执行流并发编程进程并发的优劣基于线程的并发编程Linux当中的线程 线程的创建使用pthread_createpthread_join对线程进行等待pthread_exit和pthread_cancelpthread_detach线程分离注意事项 原生线程库&#xff0c;详谈Linux的线程pthread库管理线程 线…

利用PS中Lab颜色模式进行简单调色?

【原图】 详细步骤如下&#xff1a; Step 1 : 打开PS&#xff0c;打开素材&#xff0c;点菜单栏&#xff0c;【图像】-【模式】-【Lab颜色】&#xff0c;效果如下图 Step2&#xff1a;ctrl(或command)m打开曲线工具&#xff0c;选择a通道&#xff0c;效果如下图。 Step3: 把标…

分拣机器人也卷的飞起来了

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 智能制造-话题精读 1、西门子、ABB、汇川&#xff1a;2024中国工业数字化自动化50强 2、完整拆解&#xff1a;智能…

微星主板安装双系统不能进入Ubuntu的解决办法

在微星主板的台式机上面依次安装了Windows11和Ubuntu22.04。在Ubuntu安装完成后重启&#xff0c;没有出现系统选择界面&#xff0c;直接进入了Windows11。怎么解决&#xff1f;方法如下&#xff1a; &#xff08;1&#xff09;正常安装Windows11 &#xff08;2&#xff09;安…

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数&#xff1f; 1、open函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、open函数的常见应用场…