public ContactIterator(Contact contact) {
   if (contact.isLeaf()) {
     nextLeaf = contact;
   } else {
     unfinishedIterators.push(contact.children());
   }
 }
 private Contact findNextLeaf() {
   while (true) {
     if (unfinishedIterators.isEmpty()) {
       return null;
     }
     Iterator<Contact> iterator = unfinishedIterators.pop();
     if (iterator.hasNext()) {
       Contact contact = iterator.next();
       currentIterator = iterator;
       if (iterator.hasNext()) {
         unfinishedIterators.push(iterator);
       }
       if (contact.isLeaf()) {
         return contact;
       } else {
         unfinishedIterators.push(contact.children());
       }
     }
   }
 }