力扣刷题👊【107. 二叉树的层序遍历 II】广度搜索

122 阅读1分钟

「这是我参与2022首次更文挑战的第 10 天,活动详情查看:2022首次更文挑战

题目链接

107. 二叉树的层序遍历 II - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

测试用例

示例 1:

image.png

输入: root = [3,9,20,null,null,15,7]
输出: [[15,7],[9,20],[3]]

条件限制

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

题目分析

由题可知,需要我们按照从下到上,从左往右的顺序来遍历树,汇聚每层遍历的结果后以一个二维数组的格式返回

在遍历树的操作中,如果需要按层来获取遍历的结果,那一般就需要使用广度搜索来对树进行遍历

在常规的广度搜索算法中,我们使用1个队列来记录当前需要遍历的节点,然后我们从队列中取出一个节点,然后将这个节点关联的点存放到队列中。到在这个题目中,需要我们记录每层遍历的结果,传统的1个队列无法记录每层遍历的结果。所有,我们需要额外的一个队列来辅助记录每层的数据。

我们将当前需要遍历的点存放在数组 arr1,然后遍历 arr1,将他关联的点存放到 arr2,在遍历 arr1 的时候,我们就能记录下这一层的点数据;当 arr1 遍历完成后,下一层需要遍历的点已经存放在了 arr2,我们将 arr2 的数据转到 arr1,并清空 arr2 的数据;如此往复,直到 arr1, arr2 中没有任何点记录,这个时候,我们也已经按层拿到了遍历的数据

代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrderBottom = function(root) {
    if (root == null) return []
    let arr1 = [root],
        arr2 = [],
        arrs = [];
    while (arr1.length > 0 || arr2.length > 0) {
        arrs.unshift([])
        while (arr1.length > 0) {
            let r = arr1.shift();
            arrs[0].push(r.val);
            if (r.left != null) arr2.push(r.left);
            if (r.right != null) arr2.push(r.right);
        }
        arr1 = arr2;
        arr2 = [];
    }
    return arrs;
};

image.png

空间消耗上多了不少,预计是使用了双队列记录数据造成的