DFS
DFS和stack配合使用。
Different from BFS, the nodes you visit earlier might not be the nodes which are closer to the root node
. As a result, the first path you found in DFS might not be the shortest path
.
/*
* Return true if there is a path from cur to target.
*/
boolean DFS(Node cur, Node target, Set<Node> visited) {
return true if cur is target;
for (next : each neighbor of cur) {
if (next is not in visited) {
add next to visited;
return true if DFS(next, target, visited) == true;
}
}
return false;
}
If the depth of recursion is too high, you will suffer from stack overflow
. In that case, you might want to use BFS instead or implement DFS using an explicit stack.
/*
* Return true if there is a path from cur to target.
*/
boolean DFS(int root, int target) {
Set<Node> visited;
Stack<Node> stack;
add root to stack;
while (stack is not empty) {
Node cur = the top element in stack;
remove the cur from the stack;
return true if cur is target;
for (Node next : the neighbors of cur) {
if (next is not in visited) {
add next to visited;
add next to stack;
}
}
}
return false;
}
We use while
loop and stack
to simulate the system call stack
during recursion. Running through several examples manually will definitely help you understand it better.
Last updated