N-ary Tree Level Order Traversal
2011 年 7 月 19 日
第19天。
今天的题目是 N-ary Tree Level Order Traversal :
Given an n-ary tree, return the level order traversal of its nodes’ values.
Nary-Tree input serialization is represented in their level order traversal, each group of children is separated by the null value (See examples).
Example 1:
Input: root = [1,null,3,2,4,null,5,6] Output: [[1],[3,2,4],[5,6]]
Example 2:
Input: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14] Output: [[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]
Constraints:
1000 [0, 10^4]
一道水题,简单的 BFS
或 DFS
即可,除了是一个多叉树外,和另外一道题基本是一样的。
class Node { public: int val; vector children; Node() {} Node(int _val, vector _children) { val = _val; children = _children; } };
所以,我们既可以用队列去做层次遍历(BFS),也可以用递归来实现DFS,然后按当前节点所在的高度插入到对于的数组即可:
- DFS
vector<vector> res; vector<vector> levelOrder(Node* root) { dfsWithHeight(root, 0); return res; } void dfsWithHeight(Node *root, int h) { if (root == nullptr) return; if (h == res.size()) res.push_back(vector()); res[h].push_back(root->val); for(int i = 0;i children.size(); i++) { dfsWithHeight(root->children[i], h + 1); } }
- BFS
vector<vector> levelOrder2(Node* root) { vector<vector> res; if (root == nullptr) { return res; } vector vec; queue q; q.push(root); q.push(nullptr); while(q.size() != 1) { vec.clear(); root = q.front(); while(root) { q.pop(); vec.push_back(root->val); // cout <val << endl; for(int i = 0;i children.size(); i++) { q.push(root->children[i]); } root = q.front(); } q.pop(); q.push(nullptr); res.push_back(vec); } return res; } vector<vector> levelOrder1(Node* root) { vector<vector> res; if (root == nullptr) { return res; } vector vec; vector nodes; vector nextLevelNodes; nodes.push_back(root); while(!nodes.empty()) { vec.clear(); nextLevelNodes.clear(); for(int i = 0;i val); for(int j = 0;j children.size(); j++) { nextLevelNodes.push_back(nodes[i]->children[j]); } } swap(nodes, nextLevelNodes); res.push_back(vec); } return res; }