Leetcode 102. 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
解答
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
if(root!=NULL){
q.push(root);
}
while(!q.empty()){
int size = q.size();
vector<int> tmp;
for(int i = 0; i < size; i++){
TreeNode* node = q.front();
q.pop();
tmp.push_back(node->val);
if(node->left){
q.push(node->left);
}
if(node->right){
q.push(node->right);
}
}
res.push_back(tmp);
}
return rst;
}
};
Leetcode 107. 二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
解答
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
if(root!=NULL){
q.push(root);
}
while(!q.empty()){
int size = q.size();
vector<int> tmp;
for(int i = 0; i < size; i++){
TreeNode* node = q.front();
q.pop();
tmp.push_back(node->val);
if(node->left){
q.push(node->left);
}
if(node->right){
q.push(node->right);
}
}
res.push_back(tmp);
}
reverse(res.begin(), res.end()); //(!! 区别在这里)
return res;
}
};
两道题代码的区别
在于,res最后有没有反转
429. N叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3叉树 :
返回其层序遍历:
[
[1],
[3,2,4],
[5,6]
]
说明:
树的深度不会超过 1000。
树的节点总数不会超过 5000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal
解答
class Solution {
public:
vector<vector<int>> res;
queue<TreeNode*> q;
if(root!=NULL){
q.push(root);
}
while(!q.empty()){
int size = q.size();
vector<int> tmp;
for(int i = 0; i < size; i++){
TreeNode* node = q.front();
q.pop();
tmp[i] = node->val;
// 把当前节点的子节点加入到q中
for(auto child : node->children)
{
q.push(child);
}
}
res.push_back(tmp);
}
return res;
}
};
注意:
对node节点
的子节点
进行遍历
for(auto child : node->children)
{
q.push(child);
}
上面的循环也可以写为:
vector<Node*> c = cur->children;
int n_children = c.size();
for(int j=0; j<n_children; j++)
{
q.push(c[j]);
}