Given an n-ary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).html
For example, given a 3-ary
tree:node
We should return its level order traversal:数组
[ [1], [3,2,4], [5,6] ]
Note:函数
1000
.5000
.
这道题给了咱们一棵N叉树,让咱们对其进行层序遍历。咱们作过以前二叉树的层序遍历的那道题的话Binary Tree Level Order Traversal,那么这道题也就不难了。虽然说如今每个结点可能有不少个子结点,但其实处理的思路的都是同样的。子结点放到了一个children数组中,咱们访问的时候只要遍历数组就好了。先来看迭代的写法,用到了队列queue来辅助,首先判断root是否为空,为空直接返回空数组,不然加入queue中。而后遍历queue,这里用的trick就是,要加个for循环,要将当前queue中的结点的个数统计下来,由于再加入下一层的结点时,queue的结点个数会增长,而在加入下一层结点以前,当前queue中的结点个数全都属于一层,因此咱们要把层与层区分开来,将同一层的结点都放到一个数组out中,以后再放入结果res中,这种层序遍历的思想在迷宫遍历找最短路径的时候应用的也不少,是个必需要掌握的方法呢,参见代码以下:spa
解法一:code
class Solution { public: vector<vector<int>> levelOrder(Node* root) { if (!root) return {}; vector<vector<int>> res; queue<Node*> q{{root}}; while (!q.empty()) { vector<int> out; for (int i = q.size(); i > 0; --i) { auto t = q.front(); q.pop(); out.push_back(t->val); if (!t->children.empty()) { for (auto a : t->children) q.push(a); } } res.push_back(out); } return res; } };
下面再来看递归的写法,其实层序遍历自然适合迭代的写法,但咱们强行递归也是能够的,就是有点秀。因为递归DFS的设定是一条路走到黑再返回,那么必然会跨越不一样的层数,因此为了区别当前的层,咱们须要一个变量level来标记当前的层数,根结点root就是第0层,依此类推往上加。而后还有个trick就是关于结果res的大小,因为咱们并不知道树的深度,因此一旦咱们遍历的层数超过了当前res的大小,咱们须要resize一下,这样才不会出错。以后,咱们将当前遍历到的结点加到res中的第level层中,而后遍历子结点数组,对每个子结点调用递归函数便可,参见代码以下:htm
解法二:blog
class Solution { public: vector<vector<int>> levelOrder(Node* root) { vector<vector<int>> res; helper(root, 0, res); return res; } void helper(Node* node, int level, vector<vector<int>>& res) { if (!node) return; if (res.size() <= level) res.resize(res.size() + 1); res[level].push_back(node->val); for (auto a : node->children) { helper(a, level + 1, res); } } };
相似题目:递归
Binary Tree Level Order Traversal队列
N-ary Tree Preorder Traversal
N-ary Tree Postorder Traversal
参考资料:
https://leetcode.com/problems/n-ary-tree-level-order-traversal/description/