深度优先搜索的算法分为两种,图和二叉树。
普通dfs是应用在图上,要用布尔数组记录所有结点是否访问过,防止无限递归导致死循环。
// java
public class DepthFirstSearch {
private boolean[] marked;
private int count;
public DepthFirstSearch(Graph G, int s) {
marked = new boolean[G.V()];
dfs(G, s);
}
private void dfs(Graph G, int v) {
marked[v] = true;
count++;
for (int w : G.adj(v))
if (!marked[w]) dfs(G, w);
}
public boolean marked(int w) {
return marked[w];
}
public int count() {
return count;
}
}
应用在二叉树上时,譬如说中序遍历,因为事前没有记录所有结点的访问记录情况,需要将node变量加入循环,否则会出现死循环。参考题:LeetCode94
非递归:
// c++
node = root;
while (!st.empty() || node) {
// 每次将node的左孩子结点遍历到底
while (node) {
st.push(node);
node = node->left;
}
TreeNode* tmp = st.top();
res.push_back(tmp->val);
st.pop();
node = tmp->right;
}
递归
void getNode(TreeNode* root, vector<int>& vec) {
if (!root) return;
getNode(root->left, vec);
vec.push_back(root->val);
getNode(root->right, vec);
return;
}