前言
关于二叉树,前面我们学过了很多种 深度优先遍历的方法:
①用递归调用函数
②用栈迭代方法1
③用栈迭代方法2
接下来,要学习二叉树的另一种遍历方式: 层序遍历
层序遍历二叉树介绍
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前学过的都不太一样。
需要借用一个辅助数据结构即队列来实现, 队列先进先出,符合一层一层遍历的逻辑, 而栈的先进后出适合模拟深度优先遍历也就是递归的逻辑。
而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。
使用队列实现二叉树广度优先遍历,动画如下:
以上用例的层序遍历是:6、4、7、1、3、5、8
实战:leetocde102二叉树的层序遍历
传送门
代码如下:(这份代码也可以作为 二叉树层层序遍历的模板)
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> vec;
// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
result.push_back(vec);
}
return result;
}
};
实战:leetocde107二叉树的层次遍历 II
传送门
相较于前一个代码, 就是reverse了一下最终得结果。
代码如下:
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> vec;
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
result.push_back(vec);
}
reverse(result.begin(), result.end()); // 在这里反转一下数组即可
return result;
}
};
是不是很nice?