二叉树广度优先遍历(Java实现)
算法思路
将根节点存入队列
取出队列首元素,输出节点储存数据
检查该节点是否有子节点,有则加入队列
只要队列不为空则重复第二,三步
算法实现
二叉树的实现
节点类
左右子节点的引用
Node
left Node
right 保存的数据
T data
重写
toString()
方便查看输出结果
1class Node<T> {
2 T data;
3 Node<T> left = null;
4 Node<T> right = null;
5
6 public Node(T data) {
7 this.data = data;
8 }
9
10 @Override
11 public String toString() {
12 return "" + data;
13 }
14}
二叉树类
根节点`Node
root` 判断是否为空的方法`isEmpty()`
1public class CompleteBinaryTree<T> {
2 Node<T> root;
3 public boolean isEmpty() {
4 return root == null;
5 }
6}
具体步骤
声明一个队列保存待遍历的节点
Queue<node
> queue = new LinkedList<>();</node 先把根节点加入队列
只要队列非空则循环操作
弹出队首`queue.remove();`并输出数据
左右子节点非空则加入队列
1 public void breadthFirstTravel() {
2 if (isEmpty()) {
3 System.out.println("树为空");
4 return;
5 }
6 Queue<Node<T>> queue = new LinkedList<>();
7 queue.add(root);
8 while (!queue.isEmpty()) {
9 Node<T> cur = queue.remove();
10 System.out.println(cur.data);
11 if (cur.left != null) {
12 queue.add(cur.left);
13 }
14 if (cur.right != null) {
15 queue.add(cur.right);
16 }
17 }
18 }
测试
测试放到https://www.jianshu.com/p/895b25409f89
完整代码
1class Node<T> {
2 T data;
3 Node<T> left = null;
4 Node<T> right = null;
5
6 public Node(T data) {
7 this.data = data;
8 }
9
10 @Override
11 public String toString() {
12 return "" + data;
13 }
14}
15public class CompleteBinaryTree<T> {
16 Node<T> root;
17 public boolean isEmpty() {
18 return root == null;
19 }
20 public void breadthFirstTravel() {
21 if (isEmpty()) {
22 System.out.println("树为空");
23 return;
24 }
25 Queue<Node<T>> queue = new LinkedList<>();
26 queue.add(root);
27 while (!queue.isEmpty()) {
28 Node<T> cur = queue.remove();
29 System.out.println(cur.data);
30 if (cur.left != null) {
31 queue.add(cur.left);
32 }
33 if (cur.right != null) {
34 queue.add(cur.right);
35 }
36 }
37 }
38}