1. Introduction
Given the root of an n-ary tree, return the postorder traversal of its nodes’ values.
This article is part of Binary Tree-Traversals. Read more about Binary Tree traversals here.
2. Content
I have explained the Postorder traversal in Binary Tree in this article. I would recommend you to read that first.
We can do Postorder traversal in n-ary tree‌:
- Visit the root node
- Recursively traverse its children
Postorder Traversal Result: [2,6,14,11,7,3,12,8,4,13,9,10,5,1]
3. Postorder using Recursion
Recursion code is very simple. We will recurse all the children of the root node. Once that is done, we will visit the nodes.
public List<Integer> postorder(Node root) {
List<Integer> result = new ArrayList();
if (root == null) return result;
postorder(root, result);
return result;
}
private void postorder(Node root, List<Integer> result) {
if (root == null) return;
for (Node node : root.children)
postorder(node, result);
result.add(root.val);
}
Time and Space complexity nomenclature: n where n is the total number of nodes in the tree.
Time Complexity: O(n) because we traverse the entire tree.
Space Complexity: O(n) because we save all the nodes in the auxiliary result.
4. Postorder using Iteration
Postorder traversal using Iteration is a little complicated as we need to maintain the nodes that are already traversed.
public List<Integer> postorderIterative(Node root) {
if (root == null)
return List.of();
List<Integer> result = new ArrayList();
Set<Node> visited = new HashSet<>();
Deque<Node> stack = new ArrayDeque<>();
stack.push(root);
while (!stack.isEmpty()) {
Node curr = stack.peek();
// If no children exist for this node, then visit it.
if (curr.children.isEmpty()) {
stack.pop();
result.add(curr.val);
} else {
// If we already visited this node, then insert in
// result.
if (visited.contains(curr)) {
stack.pop();
result.add(curr.val);
continue;
}
// Push all children in reverse into stack so
// We can access them from left to right.
for (int i = curr.children.size() - 1; i >= 0; i--) {
stack.push(curr.children.get(i));
}
// Once this node is visited, then push it into the visited set
// so we won't visit it again.
visited.add(curr);
}
}
return result;
}
Time Complexity: O(n) because we traverse the entire tree.
Space Complexity: O(n) because we save all the nodes in the auxiliary result.
5. Conclusion:
In this article, we saw Postorder Traversal of the n-ary Tree using Recursion and Iteration.