Binary Tree Traversal
Depth-first search
Pre-order
recursive
public class RecursiveSolution {
void preorder(Node node) {
if (node == null)
return;
System.out.println(node.value);
preorder(node.left);
preorder(node.right);
}
}
iterative
right child is pushed first so that left is processed first
public class IterativeSolution {
void preorder(Node node) {
if (node == null)
return;
Deque<Node> stack = new ArrayDeque<>();
stack.push(node);
while (!stack.isEmpty()) {
Node current = stack.pop();
System.out.println(current.value);
if (current.right != null)
stack.push(current.right);
if (current.left != null)
stack.push(current.left);
}
}
}
In-order
recursive
public class RecursiveSolution {
void inorder(Node node) {
if (node == null)
return;
inorder(node.left);
System.out.println(node.value);
inorder(node.right);
}
}
iterative
public class IterativeSolution {
void inorder(Node node) {
Deque<Node> stack = new ArrayDeque<>();
while (node != null || !stack.isEmpty()) {
if (node != null) {
stack.push(node);
node = node.left;
} else {
node = stack.pop();
System.out.println(node.value);
node = node.right;
}
}
}
}
Post-order
recursive
public class RecursiveSolution {
void postorder(Node node) {
if (node == null)
return;
postorder(node.left);
postorder(node.right);
System.out.println(node.value);
}
}
iterative
public class IterativeSolution {
void postorder(Node node) {
Deque<Node> stack = new ArrayDeque<>();
Node last = null; // last node visited
while (node != null || !stack.isEmpty()) {
if (node != null) {
stack.push(node);
node = node.left;
} else {
Node top = stack.peek();
if (top.right != null && top.right != last) {
node = top.right;
} else {
System.out.println(top.value);
last = stack.pop();
}
}
}
}
}