题目描述:
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3叉树
:
返回其层序遍历:
[
[1],
[3,2,4],
[5,6]
]
说明:
- 树的深度不会超过
1000
。 - 树的节点总数不会超过
5000
。
思路:
BFS,与二叉树的层序遍历类似,先将根节点入队列,然后循环出队列,每次出队列的同时将出队节点的孩子全部入队列。
num用于记录队列中当前行的节点个数,每次出队列时num减一;nextNum则用于记录下一行的节点个数,每有一个出队列的节点的全部孩子入队列,nextNum增加相应个数。当一行的节点全部出队列后,将存储这一行的vector加入到res中,最终返回res。
代码如下:
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
vector<vector<int>> res;
vector<int> temp;//temp用于存放一行的全部元素
queue<Node*> q;
Node* node;
int num = 1, nextNum = 0;
if (root) {//若此树不为空树
q.push(root);
while (!q.empty()) {//当队列还不为空
node = q.front();
q.pop();
temp.push_back(node->val);
num--;
for (int i = 0; i < node->children.size(); i++)
q.push(node->children[i]);
nextNum += node->children.size();
if (num == 0) {//当前层遍历完
num = nextNum;
nextNum = 0;
res.push_back(temp);//将temp加入res
temp.clear();//清空temp,以便下次循环存储下一行的元素
}
}
}
return res;
}
};
如果有什么疑问或者更好的方法,欢迎在评论区留言~