589. N-ary Tree Preorder Traversal - Easy
阿新 • • 發佈:2018-12-31
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
/* // 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<>(); 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; } }