广度优先搜索的定义
广度优先搜索BFS类似于树的层次遍历算法。基本思想是:首先访问顶点v,然后由v出发,依次访问v的各个未被访问过的顶点w1,w2,w3…wn。然后再访问wi(wi是w1,w2,w3…wn中的一个)未被访问过的邻接点。以此类推,直到所有的顶点都被访问过。BFS是一种分层查找的过程,每向前一步就访问一批顶点。不同于深度优先搜索那样有回退的情况。为了实现算法,需要借助于一个辅助队列并且以非递归的形式来实现。(来自网页)
思路:对于上面这棵树,BFS与DFS遍历节点顺序不同。
BFS: 1 3 2 4 5 6
DFS: 1. 3 5 6 2 4
代码
BFS使用queue实现非递归,是有一个模板的。
public List> levelOrderBottom(TreeNode root) {
List> levelTraversal = new ArrayList>();
Queue queue = new LinkedList();
if(root!=null){
queue.add(root);
}
while(!queue.isEmpty()){
int size = queue.size();//长度
List level = new ArrayList();
for(int i=0;i
这道题目也可以使用递归版,不过使用的有点勉强.
public List> levelOrderBottom(TreeNode root) {
List> levelTraversal = new ArrayList>();
levelMaker(root, levelTraversal, 0);
return levelTraversal;
}
private void levelMaker(TreeNode node, List> result, int level) {
if (node == null) return;
if (result.size() <= level) {
result.add(0, new ArrayList());
}
result.get(result.size() - 1 - level).add(node.val);
levelMaker(node.left, result, level + 1);
levelMaker(node.right, result, level + 1);
}
代码