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
|
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(); for(int i = 0; i < len; i++){ Node* n = q.front(); q.pop(); t.push_back(n->val); 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
|
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); }
|