public class DepthFirstIterator implements Iterator {
  private Stack> stack = new Stack>();
  public DepthFirstIterator(Iterator it) {
  stack.push(it);
   } public boolean hasNext() {
  if (stack.isEmpty()) {
  return false;
  } else {
    Iterator it = stack.peek();
    if (it.hasNext()) {
      return true;
    } else {
    stack.pop();
    return hasNext();
    }
  }
 }  public Node next() {
  if (hasNext()) {
  Iterator it = stack.peek();
  Node next = it.next();
  if (next instanceof BranchNode) {
    stack.push(next.iterator());
  }
    return next;
  } else {
    return null;
  }
 }
  public void remove() {
  throw new UnsupportedOperationException("Can’t remove node, yet");
  }
}
树:
Root
 / | \
 A B C
/ \
D F
/
E从根节点Root开始遍历,第一个子节点,也就是Root自己的第一个直属子节点,是A。下一个呢?因为A是一个树枝节点,所以我们把它先压入堆栈。下一次从A开始
这里看不明白,为何下一次从A开始呢。关于这段递归,高手能详细解释一下吗。多谢。
网上原文:
http://203.208.37.104/search?q=cache:wr1rPGN7KYMJ:it.kswchina.com/ncre/ej/ja/fd/444583.html+java+%E8%BF%AD%E4%BB%A3%E5%99%A8+%E9%80%92%E5%BD%92&cd=1&hl=zh-CN&ct=clnk&gl=cn&st_usg=ALhdy29Utz_7xj0nJqz_FqtwcHyEJGazFQ

解决方案 »

  1.   

    深度遍历就是这样,我copy一个原理 你看看 希望有帮助:
    首先我们来想象一只老鼠,在一座不见天日的迷宫内,老鼠在入口处进去,要从出 口出来。那老鼠会怎么走?当然是这样的:老鼠如果遇到直路,就一直往前走,如果遇到分叉路口,就任意选 择其中的一个继续往下走,如果遇到死胡同,就退回到最近的一个分叉路口,选择另一条道路再走下去,如果 遇到了出口,老鼠的旅途就算结束了。深度优先搜索法的基本原则就是这样:按照某种条件往前试探搜索,如 果前进中遭到失败(正如老鼠遇到死胡同)则退回头另选通路继续搜索,直到找到条件的目标为止
      

  2.   

    从根节点Root开始遍历,第一个子节点,也就是Root自己的第一个直属子节点,是A。下一个呢?因为A是一个树枝节点,所以我们把它先压入堆栈。下一次从A开始 
    这里看不明白,为何下一次从A开始呢。能不能结合这个树说明一下。
      

  3.   

    既然没人给楼主解释,那我就来解释吧。看类名知道这是一个深度优先的树遍历算法。那么什么是深度优先呢?很简单,就是比如从root开始遍历,那么root如果有子节点的话,那么接下来就去遍历子节点,以你的图为例子,那这个子节点就是A,好了接下来这点就是区分深度优先和另一种算法广度优先的地方。如果我这个时候去遍历A的子节点,也就是节点D的话,那么这就是深度优先算法;如果去遍历A的兄弟节点,那么这就是广度优先算法。所以最后你发现树的深度优先遍历就是中序遍历,前提是你从左到右的遍历树。而深度优先是按层来访问树的节点的。