前言
二叉树的层次遍历应该是数据结构里面最基础的算法了,比较容易想到的就是用队列
,刚好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] << " "