文章内容是自己刷leetcode题目的一些总结。
文章内容参考公众号: 代码随想录。
一.前言
在之前的文章中,我们介绍了二叉树的递归遍历与迭代遍历,还有迭代遍历的统一写法。今天这篇文章我们来分析二叉树的层序遍历。
二.层序遍历
1.迭代写法
因为层序遍历是要按照树的层次结构一层一层从左到右遍历,所以会用到队列(先进先出)这种数据结构,注意在遍历每层的过程中保存队列大小。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root == nullptr) {
return ans;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()) {
int n = q.size(); //这里要用n把队列大小保存,因为在遍历一层的过程中,队列大小是在不断变化的
vector<int> tem;
for(int i = 0; i < n; ++ i) { //遍历每一层
auto node = q.front();
q.pop();
tem.emplace_back(node->val);
if(node->left) {
q.push(node->left);
}
if(node->right) {
q.push(node->right);
}
}
ans.emplace_back(tt); //将一层加入结果
}
return ans;
}
};
2.递归写法
递归写法中用深度进行递归
class Solution {
public:
void order(TreeNode* node, vector<vector<int>>& ans, int depth) {
if(node == nullptr) {
return ;
}
if(ans.size() == depth) { //每次到了一个新的深度就增加一个空的数组
ans.push_back(vector<int> ());
}
//中左右
ans[depth].push_back(node->val); //根据深度来确定每个节点的位置
order(node->left, ans, depth + 1); //要保证是先左后右
order(node->right, ans, depth + 1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
//层序遍历:递归法,用到深度
int depth = 0;
vector<vector<int>> ans;
order(root, ans, depth);
return ans;
}
};
三.总结
今天我们总结了二叉树的层序遍历,用到了迭代和递归两种方法。在迭代中用到了队列进行节点的存取,在递归中用深度进行遍历。
至此二叉树的遍历方式告一段落。