胡扯:前几天在刷DFS的题,然后把简单的题刷完后,开始准备BFS,发现BFS 和 DFS 的题都有些重复。只剩下两个题了。这个BFS的层序遍历,是个简单题,但是也写了一会,主要是之前没有这方面的经验。
思路:
1、BFS 层序遍历,一层层的遍历。我们可以把多叉树,每一层看成一个集合。(根节点,可以看成只有一个节点的集合)
2、然后我们使用递归的方法一层层去遍历。
3、第一步,就是遍历传递过来的 集合,这个集合就是这一层的全部数据了。
4、第二步,就是去找到下一层的全部节点。操作就是遍历传递过来的 集合,看看它有没有孩子节点。有就存放在一个新的集合里面。
5、第三步,下一层的节点全部遍历完成之后。把新的 集合 当作参数传递给下一层的递归。
BFS 遍历 多叉树 代码:
// root 在你调用这个方法的时候可以
// List<Node> a = new ArrayList<Node>();
// a.add(root);
// bfs( a );
void bfs (List<Node> root){
// 第一步遍历当前层全部的节点
for (Node r : root)
System.out.print(r.val + " ");
System.out.println();
//第二步查找下一层全部的节点
List<Node> crr = new ArrayList<>();
for (Node r : root){
if (r.children != null){
for (Node n : r.children)
crr.add(n);
}
}
// 看下一层节点是否为0 不可以用 crr != null 因为这个 crr 已经new 出来了
if (crr.size() > 0)
bfs(crr);
}
leetcode 答案代码:
class Solution {
List<List<Integer>> arr = new ArrayList<>();
void bfs (List<Node> root){
List<Integer> aa = new ArrayList<>();
for (Node r : root)
aa.add(r.val);
arr.add(aa);
List<Node> crr = new ArrayList<>();
for (Node r : root){
if (r.children != null){
for (Node n : r.children)
crr.add(n);
}
}
if (crr.size() > 0)
bfs(crr);
}
public List<List<Integer>> levelOrder(Node root) {
if (root == null)
return null;
List<Node> a = new ArrayList<Node>();
a.add(root);
bfs( a );
return arr;
}
}