https://leetcode.com/problems/binary-tree-preorder-traversal/

Recursive

1
2
3
4
5
6
7
8
9
10
11
12
13
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> lst = new ArrayList<>();
pre(root, lst);
return lst;
}
private void pre(TreeNode node, List<Integer> lst) {
if (node == null) {
return;
}
lst.add(node.val);
pre(node.left, lst);
pre(node.right, lst);
}

Iterative solution

Pre-order, in-order, or post-order are all depth-first search (DFS). So, using a stack is clearly the way to go.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode tn = stack.pop();
list.add(tn.val);
if (tn.right != null) {
stack.push(tn.right);
}
if (tn.left != null) {
stack.push(tn.left);
}
}
return list;
}

Cool solution (Divide & Conquer)

1
2
3
4
5
6
7
8
9
10
11
12
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
List<Integer> left = preorderTraversal(root.left);
List<Integer> right = preorderTraversal(root.right);
list.add(root.val);
list.addAll(left);
list.addAll(right);
return list;
}