秋招-算法-二叉树层序遍历

82 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情 >>

一、题目描述 LeetCode剑指 Offer 32 - II.

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如:给定二叉树:[3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

按层序遍历返回其结果:

[
  [3],
  [9,20],
  [15,7]
]

二、解题思路

1.本题要求按层序遍历二叉树,考虑广度优先搜索解决。
2.在搜索时可以考虑使用队列来用作存储结构,将二叉树的每一层依次入队、出队以实现层序遍历效果。具体细节如下:

  • 首先将根节点入队,并计算队列长度;
  • 进入 for 循环,循环的终止条件为达到队列长度,依次将节点出队,并将节点值加入到数组中进行保存,出队的同时判断其左右节点是否为空,若不为空则将其入队;
  • 在退出 for 循环时,将数组保存到解集中,重置数组和队列长度。

三、代码

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();
    if (root == null){
        return res;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    TreeNode node = null;
    while (!queue.isEmpty()){
        List<Integer> list = new ArrayList<>();
        int count = queue.size();
        for (int i=count; i>0; i--){
            node = queue.poll();
            list.add(node.val);
            if (node.left != null){
                queue.add(node.left);
            }
            if (node.right != null){
                queue.add(node.right);
            }
        }
        res.add(list);
    }
    return res;
}

四、总结

本题使用队列进行二叉树的层序遍历,灵活的使用了队列的特点,并巧妙的将队列长度作为循环的终止条件,仅使用了一个队列就完成了遍历过程。每个节点进队出队各一次,故渐进时间复杂度为 O(n)O(n);队列中元素的个数不超过 nn 个,故渐进空间复杂度为 O(n)O(n)。