vlambda博客
学习文章列表

二叉树广度优先遍历(Java实现)

算法思路
  1. 将根节点存入队列

  2. 取出队列首元素,输出节点储存数据

  3. 检查该节点是否有子节点,有则加入队列

  4. 只要队列不为空则重复第二,三步

算法实现

二叉树的实现
  1. 节点类

  • 左右子节点的引用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}
  1. 二叉树类

    • 根节点`Node

      root`
    • 判断是否为空的方法`isEmpty()`

1public class CompleteBinaryTree<T{
2    Node<T> root;
3     public boolean isEmpty() {
4        return root == null;
5    }
6}
具体步骤
  1. 声明一个队列保存待遍历的节点Queue<node &gt; queue = new LinkedList&lt;&gt;();</node

  2. 先把根节点加入队列

  3. 只要队列非空则循环操作

    • 弹出队首`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}