【小浩算法 cpp题解】层次遍历与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] << " "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值