From 2c830c0cd129232e3a7325000e24d8c597e0f39c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= <14021051@buaa.edu.cn> Date: Wed, 14 Nov 2018 23:53:14 +0800 Subject: [PATCH] Create 429. N-ary Tree Level Order Traversal.md --- 429. N-ary Tree Level Order Traversal.md | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 429. N-ary Tree Level Order Traversal.md diff --git a/429. N-ary Tree Level Order Traversal.md b/429. N-ary Tree Level Order Traversal.md new file mode 100644 index 0000000..6e51538 --- /dev/null +++ b/429. N-ary Tree Level Order Traversal.md @@ -0,0 +1,42 @@ +# [429. N-ary Tree Level Order Traversal](https://leetcode.com/problems/n-ary-tree-level-order-traversal/description/) +# 思路 +树的层次遍历。和二叉树的层次遍历其实是一样的。 +用last指针指向每一层的最后一个节点,每当遍历到这个节点即说明遍历完一层, +此时应该将此层所有节点(用数组a_level记录)push进保存最终结果的数组res里,然后清空a_level,继续遍历下一层。 +last初始为root, 后面每当遍历完每层最后一个节点后,即将last更新成下一层的最后一个节点,为此需要用一个next_last来不断记录能确定的下一层的最右节点。 +时间复杂度和空间复杂度都是O(n) +(讨论区有一个[运行时间比较短的递归算法](https://leetcode.com/problems/n-ary-tree-level-order-traversal/discuss/157521/C++-Easy-to-understand-recursive-solution-based-on-DFS-(44-ms-beats-98.67)),但是评论说其复杂度比较高,所以没细看) + +# C++ +``` C++ +class Solution { +public: + vector> levelOrder(Node* root) { + vector>res; + if(!root) return res; + + queueq; + vectora_level; + Node *p, *next_last, *last = root; + q.push(root); + while(!q.empty()){ + p = q.front(); + q.pop(); + + a_level.push_back(p -> val); + + for(int i = 0; i < p -> children.size(); i++){ + next_last = p -> children[i]; + q.push(next_last); + } + + if(p == last){ + res.push_back(a_level); + a_level.clear(); + last = next_last; + } + } + return res; + } +}; +```