Java实现二叉树的广度优先搜索
例如:
3
/ \
9 20
/ \
15 7
返回值:[3,9,20,15,7]
也就是层序遍历,把树的每一层遍历完成之后再进入下一层
使用广度优先搜索前先要了解队列的先进先出(FIFO)
Queue<Integer> queue = new LinkedList<Integer>(); //new一个队列
queue.offer(0); // 第一个进 [0]
queue.offer(1); // 第二个进 [0, 1]
System.out.println(queue.poll()); //返回第一个元素然后删除 第一个出 当前:0 剩余:[1]
System.out.println(queue.poll()); //返回第一个元素然后删除 第二个出 当前:1 剩余:[null]
这应该很好理解吧
了解完这个概念就来看看二叉树的BFS
public class Node {
public int data;
public Node left;
public Node right;
public Node(){
}
public Node(int i){
this.data = i;
}
}
ArrayList<Integer> list = new ArrayList<>();
Node node = new Node(50);
node.left = new Node(10);
node.right = new Node(90);
node.left.left = new Node(20);
node.left.right = new Node(30);
node.right.left = new Node(70);
node.right.right = new Node(80);
//上面都是数据的准备,最后的数据结构是这样的
50
/ \
10 90
/ \/ \
20 30 70 80
//所以最后遍历完成的结果应该是[50,10,90,20,30,70,80]
Queue<Node> queue = new LinkedList<Node>(); //new一个队列
queue.offer(node); //把root放入队列
while (queue.size() != 0){ //如果队列为空就表示遍历完了所有的结点了
Node poll = queue.poll(); //取出最先进入的结点并删除
//下面就不用讲了吧...
if (poll.left != null){
queue.offer(poll.left);
}
if (poll.right != null){
queue.offer(poll.right);
}
list.add(poll.data);
}
System.out.println(list); // [50, 10, 90, 20, 30, 70, 80]