代码模板
BFS模板
def BFS(graph, start, end):
visited = set()
queue = []
queue.append([start])
while queue:
node = queue.pop()
visited.add(node)
process(node)
nodes = generate_related_nodes(node)
queue.push(nodes)
# other processing work
...
DFS模板
递归玩法
visited = set()
def dfs(node, visited):
if node in visited: # terminator
# already visited
return
visited.add(node)
# process current node here.
...
for next_node in node.children():
if next_node not in visited:
dfs(next_node, visited)
非递归玩法
def DFS(self, tree):
if tree.root is None:
return []
visited, stack = [], [tree.root]
while stack:
node = stack.pop()
visited.add(node)
process (node)
nodes = generate_related_nodes(node)
stack.push(nodes)
# other processing work
...
二叉树的层次遍历
BFS的高频经典题目
BFS解法
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return new ArrayList<>();
LinkedList<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
queue.offerLast(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> tmpList = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode cur = queue.pollFirst();
tmpList.add(cur.val);
if (cur.left != null) queue.offerLast(cur.left);
if (cur.right != null) queue.offerLast(cur.right);
}
res.add(tmpList);
}
return res;
}
}
虽然是经典的BFS题目,但是用DFS也可以做出来
DFS解法
public class Solution {
List<List<Integer>> res;
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return new LinkedList<>();
res = new LinkedList<>();
dfs(root, 0);
return res;
}
private void dfs(TreeNode root, int depth) {
if (root == null) return;
if (depth >= res.size()) res.add(new LinkedList<>());
res.get(depth).add(root.val);
dfs(root.left, depth + 1);
dfs(root.right, depth + 1);
}
}
括号生成
DFS解法:
public class Solution {
List<String> res;
int n;
public List<String> generateParenthesis(int n) {
res = new ArrayList<>();
this.n = n;
dfs(0, 0, "");
return res;
}
/**
* @param left 左括号个数
* @param right 右括号个数
* @param s 结果字符串
*/
private void dfs(int left, int right, String s) {