[路飞]_二叉树的层序遍历 II

205 阅读1分钟

107. 二叉树的层序遍历 II

题目

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

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

   3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层序遍历为:

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

解题思路

这也能算一题,这不是一样的吗??这也能算一题,我真的是~~

参见另一片:从上到下打印二叉树 II

递归法

通过level变量记录二叉树递归层级;将枚举到的二叉树节点值塞进指定层级中。输出的时候将数组反转即可

var levelOrderBottom = function(root) {
    if (!root) return [];
    const result = []
    helper(root, 0)
    //输出的时候将数组反转即可
    return result.reverse()
    function helper(node, level) {
        if (node === null) return
        if (result[level] === undefined) {
        result[level] = [node.val]
        } else [result[level].push(node.val)]

        helper(node.left, level + 1)
        helper(node.right, level + 1)
    }
};

广度优先遍历

将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印。

var levelOrderBottom = function(root) {
    if (root === null) return []
    const result = []
    let stack = [root]
    while (stack.length) {
        const path = []
        for (let i = stack.length - 1; i >= 0; i--) {
        let temp = stack.shift()
        path.push(temp.val)
        temp.left && stack.push(temp.left)
        temp.right && stack.push(temp.right)
        }
        // 将结果放在队列头部
        result.unshift(path)
    }
    return result
};