目录
一:N叉树的层序遍历
1.1题目

题目链接:https://leetcode.cn/problems/n-ary-tree-level-order-traversal/
1.2算法原理

1.3代码
cpp
class Solution {
public:
vector<vector<int>> levelOrder(Node* root)
{
vector<vector<int>> ret;//记录最终结果
queue<Node*> q;//层序变量所需要的队列
if(root == nullptr) return ret;
q.push(root);
while(q.size())
{
int sz = q.size();//统计本层的节点个数
vector<int> tmp;//统计本层的值
for(int i = 0; i <sz;i++)
{
Node* t = q.front();
q.pop();
tmp.push_back(t->val);//把节点的值加入数组
//把孩子节点加入队列
for(Node* child : t->children)
if(child != nullptr)
q.push(child);
}
ret.push_back(tmp);
}
return ret;
}
};
二:二叉树的锯齿形层序遍历
2.1题目

题目链接:https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/description/
2.2算法原理
锯齿形的层序遍历与第一题的层序遍历唯一不同的是,如果认为头结点是第一层,每一个奇数层都是正常层序遍历的逆序,也就是每次到奇数层的时候,先正常层序遍历,最后push到结果之前逆序即可
2.3代码
cpp
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root)
{
vector<vector<int>> ret;
queue<TreeNode*> queue;
if(root == nullptr) return ret;
queue.push(root);
int cont = 0;
while(queue.size())
{
int n = queue.size();//当前层要遍历的次数
vector<int> tmp;//统计当前层的值
for(int i = 0; i < n;i++)
{
TreeNode* cur = queue.front();
queue.pop();
tmp.push_back(cur->val);
if(cur->left) queue.push(cur->left);
if(cur->right) queue.push(cur->right);
}
if(cont%2) reverse(tmp.begin(),tmp.end());
ret.push_back(tmp);
cont++;
}
return ret;
}
};
三:二叉树最大宽度
3.1题目

题目链接:https://leetcode.cn/problems/maximum-width-of-binary-tree/
3.3算法原理

3.3代码
cpp
class Solution {
public:
int widthOfBinaryTree(TreeNode* root)
{
vector<pair<TreeNode*,unsigned int>> q;//使用数组模拟栈,方便拿去队尾元素
unsigned int ret = 0;
q.push_back({root,1});
while(q.size())
{
int n = q.size();//统计该层元素个数
auto& [x1,y1] = q[0];//队头
auto& [x2,y2] = q.back();//队尾
ret = max(ret,y2-y1+1);
vector<pair<TreeNode*,unsigned int>> tmp;
for(auto &[x,y] : q)
{
if(x->left) tmp.push_back({x->left,y*2});
if(x->right) tmp.push_back({x->right,y*2+1});
}
q = tmp;//更新数组
}
return ret;
}
};
四:在每个树中找最大值
4.1题目

题目链接:https://leetcode.cn/problems/find-largest-value-in-each-tree-row/
4.2算法原理
与第一个题目的层序遍历原理相同,只是把每层的值加入数组逻辑改为比较每层值的大小取最大值
4.3代码
cpp
class Solution {
public:
vector<int> largestValues(TreeNode* root)
{
vector<int> ret;
if(root == nullptr) return ret;
queue<TreeNode*> q;
q.push(root);
while(q.size())
{
int n = q.size();
int val = INT_MIN;
for(int i = 0; i < n;i++)
{
TreeNode* cur = q.front();
q.pop();
val = max(val,cur->val);
if(cur->left) q.push(cur->left);
if(cur->right) q.push(cur->right);
}
ret.push_back(val);
}
return ret;
}
};