在之前的文章《树的前中后序递归遍历》 和 《二叉树的统一迭代方法》 我们已经讲解了二叉树的前中后序的递归和迭代遍历方式。然而二叉树的前中后序遍历都是通过先深度搜索。有时候我们需要进行层间搜索。这样前中后序的遍历的缺点就显露出来了。

以上图为例
因为是层序遍历,我们需要思考假如我们有节点1,可以通过其左右子节点获得节点2和节点3,但是我们要保证节点2要比节点3先遍历。因此我们需要借助队列。
代码实现:
- package cn.msf.tree;
-
- import java.util.ArrayDeque;
- import java.util.ArrayList;
- import java.util.Deque;
- import java.util.List;
-
- /**
- * @author : msf
- * @date : 2022/12/5
- */
- public class LevelTraversal {
-
- public static void main(String[] args) {
- TreeNode root = new TreeNode(1);
- TreeNode node1 = new TreeNode(2);
- TreeNode node2 = new TreeNode(3);
- TreeNode node3 = new TreeNode(4);
- TreeNode node4 = new TreeNode(5);
- TreeNode node5 = new TreeNode(6);
- TreeNode node6 = new TreeNode(7);
-
- root.left = node1;
- root.right = node2;
- node1.left = node3;
- node1.right = node4;
- node2.left = node5;
- node2.right = node6;
- LevelTraversal levelTraversal = new LevelTraversal();
- List
> result = levelTraversal.levelPrint(root); - for (ArrayList
arrayList : result) { - System.out.println(arrayList);
- }
- }
-
- private List
> levelPrint(TreeNode root) { - if (root == null) {
- return null;
- }
- List
> result = new ArrayList<>(); - Deque
queue = new ArrayDeque<>(); - queue.push(root);
- while (!queue.isEmpty()) {
- int size = queue.size();
- ArrayList
path = new ArrayList<>(); - for (int i = 0; i < size; i++) {
- TreeNode node = queue.pop();
- path.add(node.value);
- if (node.left != null) {
- queue.add(node.left);
- }
- if (node.right != null) {
- queue.add(node.right);
- }
- }
- result.add(path);
- }
- return result;
- }
- }
上述代码执行结果:
