leetcode 429,N-ary Tree Level Order Traversal,难度medium;
0. 题干
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3叉树 :
返回其层序遍历:
[
[1],
[3,2,4],
[5,6]
]
说明:
树的深度不会超过 1000。
树的节点总数不会超过 5000。
1. 代码
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<vector<int>> result;
vector<vector<int>> levelOrder(Node* root) {
if (!root) {
return result;
}
result.emplace_back(vector<int>{root->val});
//c++11新加入了emplace_back():
//如果要将一个临时变量push到容器的末尾,
//push_back()需要先构造临时对象,再将这个对象拷贝到容器的末尾,
//而emplace_back()则直接在容器的末尾构造对象,这样就省去了拷贝的过程。
queue<Node*> que;
que.push(root);
while (que.size()) {
int queSize = que.size();
vector<int> level;
for (int i = 0; i < queSize; ++i) {
Node* tmp=que.front();
que.pop();
for (auto x : tmp->children) {
level.emplace_back(x->val);
que.push(x);
}
}
if (level.size() != 0) {
result.emplace_back(level);
}
}
return result;
}
};
2. 详叙代码流程
/**
for (auto x : tmp->children) {
level.emplace_back(x->val);
que.push(x);
}
这个是处理N叉树的核心代码
创建二维数组 result;
root不为NULL,继续运行代码;
把存储了结点1的val值的一维数组地址放到result数组里面; *此时第一层层序遍历完成
以下面这个N叉树为例子;以下直接把二叉树的值视为结点名;
创建队列que,把结点1放入队列里面;
que.size()为1,创建数组level;
queSize为1,进入for循环,tmp存储结点1地址;
pop掉结点1,依次把结点3、结点2、结点4的值存到新创建的level数组里面;
依次把结点3、结点2、结点4存到队列里面;
此时level.size()为3,把存储了结点3、2、4的值的一维数组地址存到result数组里面; *此时第二层层序遍历完成
此时que.size()为3,queSize为3,
新创建一维数组level,tmp存储结点3的地址,把结点3,pop掉;
把结点3的两个孩子,结点5和结点6的val值依次存到level新创建的level数组里面,并把结点5和结点6存到队列里面。
继续for (int i = 0; i < queSize; ++i) {
循环,tmp存储结点2地址,pop掉结点2 ,结点2没有孩子,就不管内部for循环,继续for循环,
tmp存储结点4的地址,pop掉结点4,结点2没有孩子,就不管内部for循环.
此时level.size()为3,把存储了结点5、6的值的一维数组地址,存到result数组里面; *此时第三层层序遍历完成
que.size()值为2,queSize值为2;
新创建一维数组level,
tmp存储结点5地址,pop掉结点5,结点5没有孩子,不管for (auto x : tmp->children) {循环,
tmp存储结点6地址,pop掉结点6,结点6没有孩子,不管for (auto x : tmp->children) {循环,
此时level.size()为0,que.size()为0;
代码结束,返回result。