The iterative (non-recursive) function preorderTreeTraverse() can perform preorder traversing of a binary tree with the help of a stack that can hold pointers to nodes of the tree.

Also, the iterative (non-recursive) function layerTreeTraverse() can perform level-order traversing of a binary tree with the help of a queue that can hold pointers to nodes of the tree.

void
preorderTreeTraverse (link h, void visit (link)) {
  STACK<link> s (max);

  s.push (h);

  while (!s.empty ()) {
    visit (h = s.pop ());

    if (h->r != 0) s.push (h->r);
    if (h->l != 0) s.push (h->l);
  }
}

void
layerTreeTraverse (link h, void visit (link)) {
  QUEUE<link> q (max);

  q.put (h);

  while (!q.empty ()) {
    visit (h = q.get ());

    if (h->l != 0) q.put (h->l);
    if (h->r != 0) q.put (h->r);
  }
}