Recursive

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

Iterative two-stack

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

Expression tree eval

Post-order evaluates arithmetic expression trees: children (operands) first, then apply operator at root.

Recursive

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

Iterative two-stack

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

Expression tree eval

Post-order evaluates arithmetic expression trees: children (operands) first, then apply operator at root.

Tree deletion

Delete children before parent. Post-order ensures no dangling references.