Topic
- Tree
Description
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 , 1 0 4 ] [0, 10^4] [0,104].
- 0 < = N o d e . v a l < = 1 0 4 0 <= Node.val <= 10^4 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?
Analysis
方法一:递归法
方法二:迭代法
Submission
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.lun.util.NAryTree.Node;
public class NAryTreePreorderTraversal {
//方法一:DFS
public List<Integer> preorder(Node root) {
List<Integer> result = new ArrayList<>();
preorder(root, result);
return result;
}
private void preorder(Node root, List<Integer> result) {
if(root == null)
return;
result.add(root.val);
if(root.children != null)
for(Node node : root.children)
preorder(node, result);
}
//方法二:BFS
public List<Integer> preorder2(Node root) {
List<Integer> result = new ArrayList<>();
if(root == null)
return result;
LinkedList<Node> stack = new LinkedList<>();
stack.push(root);
while(!stack.isEmpty()) {
Node node = stack.pop();
result.add(node.val);
if(node.children != null)
stack.addAll(0, node.children);
}
return result;
}
}
Test
import static org.junit.Assert.*;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.junit.Test;
import com.lun.util.NAryTree;
public class NAryTreePreorderTraversalTest {
@Test
public void test() {
NAryTreePreorderTraversal obj = new NAryTreePreorderTraversal();
assertThat(obj.preorder(NAryTree.integersToNAryTree(1, null, 3, 2, 4, null, 5, 6)),//
IsIterableContainingInOrder.contains(1, 3, 5, 6, 2, 4));
assertThat(obj.preorder(NAryTree.integersToNAryTree(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)),//
IsIterableContainingInOrder.contains(1, 2, 3, 6, 7, 11, 14, 4, 8, 12, 5, 9, 13, 10));
}
@Test
public void test2() {
NAryTreePreorderTraversal obj = new NAryTreePreorderTraversal();
assertThat(obj.preorder2(NAryTree.integersToNAryTree(1, null, 3, 2, 4, null, 5, 6)),//
IsIterableContainingInOrder.contains(1, 3, 5, 6, 2, 4));
assertThat(obj.preorder2(NAryTree.integersToNAryTree(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)),//
IsIterableContainingInOrder.contains(1, 2, 3, 6, 7, 11, 14, 4, 8, 12, 5, 9, 13, 10));
}
}