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
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
首先我们来想象一只老鼠,在一座不见天日的迷宫内,老鼠在入口处进去,要从出 口出来。那老鼠会怎么走?当然是这样的:老鼠如果遇到直路,就一直往前走,如果遇到分叉路口,就任意选 择其中的一个继续往下走,如果遇到死胡同,就退回到最近的一个分叉路口,选择另一条道路再走下去,如果 遇到了出口,老鼠的旅途就算结束了。深度优先搜索法的基本原则就是这样:按照某种条件往前试探搜索,如 果前进中遭到失败(正如老鼠遇到死胡同)则退回头另选通路继续搜索,直到找到条件的目标为止
这里看不明白,为何下一次从A开始呢。能不能结合这个树说明一下。