BFS和DFS
二叉树的先序遍历是DFS
DFS遍历使用递归(隐式使用栈):
void dfs(TreeNode root) {
if (root == null) {
return;
}
dfs(root.left);
dfs(root.right);
}
BFS遍历使用队列
void bfs(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
BFS常用于解决两类问题
- 层序遍历
- 最短路径
本题题解
层序遍历的结果与BFS遍历的结果不是完全一样的,层序遍历需要按层区分开
所以需要修改代码,在每一层开始遍历前,先记录此时队列中节点的数量,然后一口气处理这n个节点,这样就可以把不同层分开。
public class Solution102 {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new LinkedList<>();
if (root == null){
return result;
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while (!queue.isEmpty()) {
int n = queue.size();
List<Integer> list = new LinkedList<> ();
for (int i = 0; i < n; i++){
TreeNode temp = queue.poll();
list.add(temp.val);
if (temp.left != null){
queue.offer(temp.left);
}
if (temp.right != null) {
queue.offer(temp.right);
}
}
result.add(list);
}
return result;
}
}
BFS模板
1.直接BFS
void bfs(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
2.按层将结果分开
// 二叉树的层序遍历
void bfs(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
int n = queue.size();
for (int i = 0; i < n; i++) {
// 变量 i 无实际意义,只是为了循环 n 次
TreeNode node = queue.poll();
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
}
扩充:BFS最短路径问题
待补充,参考自