Recursive

void preorder(Node node, List result) {
  if (node == null) return;
  result.add(node.val);
  preorder(node.left, result);
  preorder(node.right, result);
}
Advertisement

Iterative with stack

Deque stack = new ArrayDeque<>();
stack.push(root);
while (!stack.isEmpty()) {
  Node n = stack.pop();
  result.add(n.val);
  if (n.right != null) stack.push(n.right);
  if (n.left != null) stack.push(n.left);
}
Advertisement

Serialization use case

void serialize(Node node, StringBuilder sb) {
  if (node == null) { sb.append("# "); return; }
  sb.append(node.val).append(' ');
  serialize(node.left, sb);
  serialize(node.right, sb);
}

Complexity

O(N) time. O(H) space for stack/recursion.

Recursive

void preorder(Node node, List result) {
  if (node == null) return;
  result.add(node.val);
  preorder(node.left, result);
  preorder(node.right, result);
}

Iterative with stack

Deque stack = new ArrayDeque<>();
stack.push(root);
while (!stack.isEmpty()) {
  Node n = stack.pop();
  result.add(n.val);
  if (n.right != null) stack.push(n.right);
  if (n.left != null) stack.push(n.left);
}

Serialization use case

void serialize(Node node, StringBuilder sb) {
  if (node == null) { sb.append("# "); return; }
  sb.append(node.val).append(' ');
  serialize(node.left, sb);
  serialize(node.right, sb);
}

Complexity

O(N) time. O(H) space for stack/recursion.