LeetCode 589. N-ary Tree Preorder Traversal
原题链接在这里:https://leetcode.com/problems/n-ary-tree-preorder-traversal/
题目:
Given the root
of an n-ary tree, return the preorder 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,5,6,2,4]
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,6,7,11,14,4,8,12,5,9,13,10]
Constraints:
- The number of nodes in the tree is in the range
[0, 104]
. 0 <= Node.val <= 104
- The height of the n-ary tree is less than or equal to
1000
.
Follow up: Recursive solution is trivial, could you do it iteratively?
题解:
Could use top down recursion.
Time Complexity: O(n). n is the number of nodes in the tree.
Space: O(logn). regardless res. stack space.
AC Java:
1 /* 2 // Definition for a Node. 3 class Node { 4 public int val; 5 public List<Node> children; 6 7 public Node() {} 8 9 public Node(int _val) { 10 val = _val; 11 } 12 13 public Node(int _val, List<Node> _children) { 14 val = _val; 15 children = _children; 16 } 17 }; 18 */ 19 20 class Solution { 21 public List<Integer> preorder(Node root) { 22 List<Integer> res = new ArrayList<>(); 23 if(root == null){ 24 return res; 25 } 26 27 dfs(root, res); 28 return res; 29 } 30 31 private void dfs(Node root, List<Integer> res){ 32 if(root == null){ 33 return; 34 } 35 36 res.add(root.val); 37 for(Node next : root.children){ 38 dfs(next, res); 39 } 40 } 41 }
AC C++:
1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 vector<Node*> children; 7 8 Node() {} 9 10 Node(int _val) { 11 val = _val; 12 } 13 14 Node(int _val, vector<Node*> _children) { 15 val = _val; 16 children = _children; 17 } 18 }; 19 */ 20 21 class Solution { 22 public: 23 vector<int> preorder(Node* root) { 24 vector<int> res; 25 dfs(root, res); 26 return res; 27 } 28 29 private: 30 void dfs(Node* root, vector<int>& res){ 31 if(!root){ 32 return; 33 } 34 35 res.push_back(root->val); 36 for(Node* child : root->children){ 37 dfs(child, res); 38 } 39 } 40 };
AC Python:
1 """ 2 # Definition for a Node. 3 class Node: 4 def __init__(self, val=None, children=None): 5 self.val = val 6 self.children = children 7 """ 8 9 class Solution: 10 def preorder(self, root: 'Node') -> List[int]: 11 res = [] 12 self.dfs(root, res) 13 return res 14 def dfs(self, root, res): 15 if not root: 16 return 17 res.append(root.val) 18 for child in root.children: 19 self.dfs(child, res)
Could also do it iteratively. It is the method 2 in Binary Tree Preorder Traversal.
Time Complexity: O(n).
Space: O(logn). stack space.
AC Java:
1 /* 2 // Definition for a Node. 3 class Node { 4 public int val; 5 public List<Node> children; 6 7 public Node() {} 8 9 public Node(int _val) { 10 val = _val; 11 } 12 13 public Node(int _val, List<Node> _children) { 14 val = _val; 15 children = _children; 16 } 17 }; 18 */ 19 20 class Solution { 21 public List<Integer> preorder(Node root) { 22 List<Integer> res = new ArrayList<>(); 23 if(root == null){ 24 return res; 25 } 26 27 Stack<Node> stk = new Stack<>(); 28 stk.push(root); 29 while(!stk.isEmpty()){ 30 Node cur = stk.pop(); 31 res.add(cur.val); 32 for(int i = cur.children.size() - 1; i >= 0; i--){ 33 if(cur.children.get(i) != null){ 34 stk.push(cur.children.get(i)); 35 } 36 } 37 } 38 39 return res; 40 } 41 }
AC C++:
1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 vector<Node*> children; 7 8 Node() {} 9 10 Node(int _val) { 11 val = _val; 12 } 13 14 Node(int _val, vector<Node*> _children) { 15 val = _val; 16 children = _children; 17 } 18 }; 19 */ 20 21 class Solution { 22 public: 23 vector<int> preorder(Node* root) { 24 vector<int> res; 25 if(!root){ 26 return res; 27 } 28 29 stack<Node*> stk; 30 stk.push(root); 31 while(!stk.empty()){ 32 Node* top = stk.top(); 33 stk.pop(); 34 res.push_back(top->val); 35 for(int i = top->children.size() - 1; i >= 0; i--){ 36 if(top->children[i]){ 37 stk.push(top->children[i]); 38 } 39 } 40 } 41 42 return res; 43 } 44 };
AC Python:
1 """ 2 # Definition for a Node. 3 class Node: 4 def __init__(self, val=None, children=None): 5 self.val = val 6 self.children = children 7 """ 8 9 class Solution: 10 def preorder(self, root: 'Node') -> List[int]: 11 res = [] 12 if not root: 13 return res 14 stk = [root] 15 while stk: 16 cur = stk.pop() 17 res.append(cur.val) 18 stk.extend(child for child in cur.children[::-1] if child is not None) 19 return res
类似N-ary Tree Postorder Traversal, Binary Tree Preorder Traversal.