[LeetCode 102. 二叉树的层序遍历] |刷题打卡

203 阅读2分钟

一、题目描述:

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例: 二叉树:[3,9,20,null,null,15,7],

   3
  /  \
 9   20
    /  \
   15   7

返回其层序遍历结果:

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

引自:leetcode-cn.com/problems/bi…

题目链接:102. 二叉树的层序遍历

二、思路分析:

二叉树的层序遍历类似于广度优先遍历,只是一般广度优先遍历我们得到一个数组即可。

层序遍历,我们需要给广度优先遍历的结果分层显示。

  1. 我们可以创建一个记录二叉树层数的数组 levelArr;

  2. 在根节点不为空的情况下,把根节点添加到 levelArr;

  3. while循环 遍历 levelArr ,记 levelArr 的数量 levelSize;levelSize 表示当前层有几个树结点,声明并初始化 tempArr 用于记录当前层树结点的值,tempArr 起着隔离开每层数据的作用。

  4. for 循环 依次遍历当层的左右子树,遍历过程中,更新 levelArr 中的结点。(包括移除 levelArr 第一个结点,及往 levelArr 添加新结点)

  5. 在 for 循环结束后,把 tempArr 添加到 resultArr 中;

  6. 最后返回resultArr 即可。

三、AC 代码:

class Solution {
    func levelOrder(_ root: TreeNode?) -> [[Int]] {
        var resultArr : [[Int]] = [[Int]]();
        if (root == nil) {
            // 空树
            return resultArr;
        }
        
        // 记录每一层的结点数组levelArr
        var levelArr : [TreeNode?] = [TreeNode?]();
        levelArr.append(root);

        while (levelArr.count > 0) {
            var tempArr : [Int] = [Int]();
            let levelSize = levelArr.count;
            // 遍历当前层几个结点的左右子树并处理
            for _ in 0..<levelSize {
                // 先添加到数组中的元素靠左 所以要使用从前边开始移除元素
                let node : TreeNode? = levelArr.removeFirst();
                tempArr.append(node?.val ?? 0);
                if (node?.left != nil) {
                    levelArr.append(node?.left);
                }
                if (node?.right != nil) {
                    levelArr.append(node?.right);
                }
            }
            resultArr.append(tempArr);
        }
        return resultArr;
    }
}

四、参考学习网址

二叉树

本文正在参与「掘金 3 月闯关活动」, 点击查看 活动详情