前端算法小白攻略43-leetcode(剑指 Offer 32 - II. 从上到下打印二叉树 II)

121 阅读2分钟

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

前言

今天开始我们来研究一下二叉树层序遍历及其相关的几个题型,话不多说,看题。

题目描述

剑指 Offer 32 - II. 从上到下打印二叉树 II

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

解题思路

先介绍一下题目中给我们的示例: 我们有如下一颗二叉树:

    3
   / \
  9  20
    /  \
   15   7

它的打印结果是:

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

根据题意及上图,我们可以总结出:

  1. 所谓的从上到下打印二叉树,就是把二叉树层序遍历的结果放到一个二维数组中,每一层作为二维数组中的一项,当然二叉树的层级一一对应二维数组里的元素;
  2. 要想的到最终的二维数组,我们可以直接按照层序遍历的方式把每一层节点打印出来的同时,按照对应的层级给二维数组添加元素

开始解题

解题步骤:

  1. 我们需要初始化一个存放我们打印结果的数组
  2. 执行打印的函数
    1. 判断节点是否为空,为空直接返回null,表示当前操作结束
    2. 判断当前层级,如果当前二维数组的层级比遍历的层级低,说明遍历的新的层级那么我们就需要新建一个二维数组元素的容器数组,供下面push操作使用
    3. 处理当前层级的当前节点,把节点值push到对应层级中
    4. 处理完当前节点,按照层序遍历的顺序用打印函数处理当前节点的左右子节点
  3. 返回打印结果

代码:

var levelOrder = function(root) {
    let resArr = new Array();
    print(root, 0, resArr);
    return resArr;
};

var print = function(root, k, resArr) {
    if(!root) return null;
    if(k == resArr.length) resArr.push(new Array());
    resArr[k].push(root.val);
    print(root.left, k+1, resArr);  //  子节点的层级当然是根节点的下一层即k+1层
    print(root.right, k+1, resArr);
}