589. N-ary Tree Preorder Traversal - Easy
Given an n-ary tree, return the preorder traversal of its nodes' values.
For example, given a 3-ary
tree:
Return its preorder traversal as: [1,3,5,6,2,4]
.
Note:
Recursive solution is trivial, could you do it iteratively?
M1: recursion
time: O(n), space: O(height)
/* // Definition for a Node. class Node { public int val; public List<Node> children; public Node() {} public Node(int _val,List<Node> _children) { val = _val; children = _children; } }; */ class Solution { public List<Integer> preorder(Node root) { List<Integer> res = new ArrayList<>(); preorder(root, res); return res; } public void preorder(Node root, List<Integer> res) { if(root == null) { return; } res.add(root.val); for(int i = 0; i < root.children.size(); i++) { preorder(root.children.get(i), res); } } }
M2: iteration
由于stack是先进后出,在把children加入stack的时候先reverse,使得稍后访问stack的时候,children的顺序是从左到右的
time: O(n), space: O(n) -- worst case
class Solution { public List<Integer> preorder(Node root) { List<Integer> res = new ArrayList<>(); if(root == null) { return res; } Stack<Node> s = new Stack<>(); s.add(root); while(!s.isEmpty()) { Node tmp = s.pop(); res.add(tmp.val); Collections.reverse(tmp.children); for(Node n : tmp.children) { if(n != null) { s.push(n); } } } return res; } }
二刷:
class Solution { public List<Integer> preorder(Node root) { List<Integer> res = new ArrayList<>(); if(root == null) { return res; } LinkedList<Node> stack = new LinkedList<>(); stack.offerFirst(root); while(!stack.isEmpty()) { Node cur = stack.pollFirst(); res.add(cur.val); for(int i = cur.children.size() - 1; i >= 0; i--) { stack.offerFirst(cur.children.get(i)); } } return res; } }