@Override
    public T nextImpl() {
      while (last != null) {
        Iterator<? extends T> it = last.iterator(tree);
        if (it.hasNext()) {
          T result = it.next();
          last = last.add(P1.create(result));
          descending = true;
          if (order != Order.POST) return result;
        }
        else {
          T result = last.node;
          last = last.remove();
          descending = false;
          if (order != Order.PRE && last != null) return result;
        }
      }
      descending = true;
      return stop();
    }
@Override
    public T nextImpl()