I have two idea:
1. Ignoring the efficience, using the method you suggest.
2. Add a branch in LuceneDatabase::open_post_list(string term_name), this branch code only open a postlist in current segment which contains the current visiting term.
the code may like this:
if (true == traverse_mode) {
    // open one postlist in current segment. segments[i] means the current segment which is visiting
    postlist = segments[i].open_post_list(term_name);
    postlists.merge(postlist);
} else {
    // ignoring efficience, open postlists in all segments for the term
    for (int i = 0; i < segments.size; i++) {
          postlist = segment[i].open_post_list(term_name);
          postlists.merge(postlist);
    }
}