[路飞]_LeetCode_剑指 Offer 32 - II. 从上到下打印二叉树 II - 递归

129 阅读2分钟

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

题目

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

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

    3
   /   \
  9  20
      /    \
   15      7

返回其层次遍历结果:

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

提示:

节点总数 <= 1000

来源:力扣(LeetCode)leetcode-cn.com/problems/co…

解题思路

根据题目意思,我们要把二叉树的每一层节点放在一个数组中,并返回整个二维数组。我们可以用递归的和队列两种方式来实现。

递归方式:从根节点开始,将每个节点的值放在二维数组的第 k 个数组中,如果二维数组没有第 k 个数组,则插入一个空数组。k 也代表节点所在层数。再递归把左右子节点放入第 k + 1 个数组中。

image.png

代码实现

递归实现

var levelOrder = function(root) {
    //初始化返回值
    const ans = []
    
    //把 root 放到 ans 的第 0 个数组中
    getResult(root, 0, ans)
    
    return ans
};

/**
 * 递归函数的意义:把 root 的值放到 ans 的第 k 个数组当中,k 从 0 开始
 */
var getResult = function(root, k, ans) {
    //如果 root 为空时不需要处理
    if (!root) return

    //如果 ans[k] 不存在,则先向 ans 中增加一个空数组
    if (k === ans.length) ans.push([])
    
    //将 root 的值插入第 k 个数组的末尾
    ans[k].push(root.val)
    
    //把 root 的左节点的值放到第 k + 1 个数组中
    getResult(root.left, k + 1, ans)
    
    //把 root 的右节点的值放到第 k + 1 个数组中
    getResult(root.right, k + 1, ans)
}

队列实现

var levelOrder = function (root) {
    //如果根节点有值,则入队列
    const queue = root ? [root] : []
    const ans = []

    while (queue.length) {
        const arr = []
        const len = queue.length
        
        //把当层所有节点(即此刻队列中所有节点)放在 arr 数组中
        for (let i = 0; i < len; i++) {
            //第一个节点出队列,并且把该节点的两个子节点入队列
            const node = queue.shift()
            
            //把当前节点的值插入数组
            arr.push(node.val)
            
            //如果前节点的左节点不为空,则加入队列
            if (node.left) queue.push(node.left)
            
            //如果前节点的右节点不为空,则加入队列            
            if (node.right) queue.push(node.right)
        }
        
        //当层数组放进返回值数组中
        ans.push(arr)
    }

    return ans
};

如有错误欢迎指出,欢迎一起讨论!