二叉树的层次遍历
题目链接:
https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/
部分参考于:
https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/solution/er-cha-shu-de-ceng-ci-bian-li-ii-by-leetcode-solut/
意义
实际上,任何树的层次遍历都用到这个模板。只需要在node->left和node->right方面修改一下即可。本题目用到的是BFS,感觉这个方法还是很妙的。
算法与数据结构
BFS和单调队列。
函数
基本都是概念性的函数,q.pop()弹出队首元素,栈用push_back(),队列用push。
实现
注释于题解旁边。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
auto levelOrder = vector<vector<int>>();
if (!root) {
return levelOrder;//若为空树,则返回空
}
queue<TreeNode*> q;//树的节点集合
q.push(root);//首先放入根节点
while (!q.empty()) {
auto level = vector<int>();
int size = q.size();//代表每一层有多少个节点
for (int i = 0; i < size; ++i) {
auto node = q.front();//BFS的关键
q.pop();//弹出当前的队首元素
level.push_back(node->val);//把数字放进去
if (node->left) {
//为下一次BFS做准备
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
levelOrder.push_back(level);//当前层就完结了
}
reverse(levelOrder.begin(), levelOrder.end());//最后逆序处理一下
return levelOrder;
}
};
默写一下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution{
public:
vector<vector<int>> levelOrderBottom(TreeNode * root){
auto levelOrder=vector<vector<int>>();
if(!root){
return levelOrder;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
auto level=vector<int>();
int size=q.size();
for(int i=0;i<size;i++){
auto node=q.front();
q.pop();
level.push_back(node->val);
if(node->left){
q.push(node->left);
}
if(node->right){
q.push(node->right);
}
}
levelOrder.push_back(level);
}
reverse(levelOrder.begin(),levelOrder.end());
return levelOrder;
}
} ;