「这是我参与2022首次更文挑战的第 10 天,活动详情查看:2022首次更文挑战」
题目链接
107. 二叉树的层序遍历 II - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
测试用例
示例 1:
输入: 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;
};
空间消耗上多了不少,预计是使用了双队列记录数据造成的