根据the wikipedia article about depth-first search中的解释,我认为二叉树上的DFS与前序遍历根相同 - 左 - 右(我是对吗?)。
但是我刚做了一点搜索并得到了这段代码,其作者声称DFS需要一棵树来记录节点之前是否已被访问过(或者在图形的情况下我们是否需要这样做?)。 / p>
// copyright belongs to the original author
public void dfs() {
// DFS uses Stack data structure
Stack stack = new Stack();
stack.push(this.rootNode);
rootNode.visited=true;
printNode(rootNode);
while(!stack.isEmpty()) {
Node node = (Node)s.peek();
Node child = getUnvisitedChildNode(n);
if(child != null) {
child.visited = true;
printNode(child);
s.push(child);
}
else {
s.pop();
}
}
// Clear visited property of nodes
clearNodes();
}
有人可以解释一下吗?
答案 0 :(得分:5)
是的,它是预订。但是,我不喜欢说它是一个遍历,因为你可能不会遍历树,你一找到你的元素就会停止。您打印的程序不是搜索,而是遍历:您正在打印所有内容。在二叉树中搜索的搜索功能是:
public boolean search(Tree t, int i) {
if(t == null)
return false;
elif(t.value() == i)
return true;
else
for(child in t.children()) {
if(search(child,i))
return true;
}
return false;
//return search(t.leftTree(), i) or search(t.rightTree(),i) binary tree case
}
答案 1 :(得分:4)
我认为二叉树上的dps与preorder遍历root - left - right相同。(我是对的吗?)
深度优先搜索可以是前,后或后顺序遍历。您不需要堆栈:以递归方式实现它更容易,在这种情况下,您也不需要将节点标记为已访问过。