429. N叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。

Solution1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
// 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> > data;
if(!root) return data;
queue<Node*> q;
// 从节点开始。
q.push(root);
while(!q.empty()){
vector<int> t;
int len = q.size();
//遍历目前队列中的节点,将他们逐一push进数组中。
for(int i = 0; i < len; i++){
Node* n = q.front();
//将当前元素从队列中移除。
q.pop();
//存储数据
t.push_back(n->val);
// 将每个元素下面的子节点push进队列中。
for(int j = 0; j < n->children.size(); j++){
q.push(n->children[j]);
}
}

data.push_back(t);
}
return data;
}
};

使用队列进行层序遍历。

每走到一层,记录该层有多少节点。对于该层的每一个节点都做

  • 将该节点的数据存储起来。
  • 将该节点从队列中移除。
  • 将该节点下的所有子节点都push进入队列中。

当一层节点操作完毕后,队列中存储的就为下一层的全部节点。队列的个数就为当前所在层的节点的个数。

Solution2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
// 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> > data;
dfs(root, data, 0);

return data;
}

void dfs(Node* node, vector<vector<int> > &data, int level){
if(!node) return;
//如果当前层还没有初始化。
if(data.size()<= level){
vector<int> t;
t.push_back(node->val);
data.push_back(t);
}else{
data[level].push_back(node->val);
}
for(int i = 0; i < node->children.size(); i++){
dfs(node->children[i], data, level+1);
}
}
};

递归版本。

记录当前的层数。当前节点属于哪一层就往哪一层里push元素。

初始化小技巧:

当使用双层vector时,必须先初始化每一层vector。

可以利用size巧妙的进行初始化,每走到一层,将size与当前层作比较,size总是比当前层大1。

1
2
3
4
5
 if(data.size()<= level){
vector<int> t;
t.push_back(node->val);
data.push_back(t);
}