# N叉树的层序遍历 (opens new window)

  • 难度:Medium
  • 标签:BFS DFS 递归

# 刷题思路

  • [x] 模板递归法(BFS)
  • [x] 模板迭代法(BFS)
  • [x] 模板递归法(DFS)
  • [x] 模板迭代法(DFS)

# 方法 1 模板递归法(BFS)

  • 复杂度:
    • 时间 O(n)
    • 空间 O(n)
  • 结果:
    • 执行用时:104 ms, 在所有 JavaScript 提交中击败了82.14%的用户
    • 内存消耗:41.3 MB, 在所有 JavaScript 提交中击败了66.22%的用户
var levelOrder = function(root) {
    if (!root) return []
    const res = []
    recursion([root], res, 0)
    return res
};

function recursion (nodes, res, level) {
    if (nodes.length === 0) return
    if (!res[level]) res[level] = []
    const childNodes = []
    nodes.forEach(node => {
        res[level].push(node.val)
        node.children.forEach(v => childNodes.push(v))
    })
    recursion(childNodes, res, level+1)
}

# 方法 2 模板迭代法(BFS)

  • 复杂度:
    • 时间 O(n)
    • 空间 O(n)
  • 结果:
    • 执行用时:112 ms, 在所有 JavaScript 提交中击败了58.54%的用户
    • 内存消耗:41.2 MB, 在所有 JavaScript 提交中击败了72.44%的用户
var levelOrder = function(root) {
    if (!root) return []
    const res = []
    const queue = [root]
    let level = 0
    while (queue.length > 0) {
        if (!res[level]) res[level] = []
        for (let i=0, len=queue.length; i<len; i++) {
            const node = queue.shift()
            res[level].push(node.val)
            if (node.children) node.children.forEach(item => queue.push(item))
        }
        level++
    }
    return res
};

# 方法 3 模板递归法(DFS)

  • 复杂度:
    • 时间 O(n)
    • 空间 O(n)
  • 结果:
    • 执行用时:148 ms, 在所有 JavaScript 提交中击败了6.94%的用户
    • 内存消耗:48.1 MB, 在所有 JavaScript 提交中击败了5.25%的用户
var levelOrder = function(root) {
    const res = []
    recursion(root, res, 0)
    return res
};

function recursion (node, res, level) {
    if (!node) return
    if (!res[level]) res[level] = []
    res[level].push(node.val)
    if (node.children) {
        node.children.forEach(item => recursion(item, res, level+1))
    }
}

# 方法 4 模板迭代法(DFS)

  • 复杂度:
    • 时间 O(n)
    • 空间 O(n)
  • 结果:
    • 执行用时:116 ms, 在所有 JavaScript 提交中击败了45.03%的用户
    • 内存消耗:41.3 MB, 在所有 JavaScript 提交中击败了68.77%的用户
var levelOrder = function(root) {
    if (!root) return []
    const res = []
    root.level = 0
    const stack = [root]
    while (stack.length > 0) {
        const node = stack.pop()
        if (!res[node.level]) res[node.level] = []
        res[node.level].push(node.val)
        if (node.children) {
            const len = node.children.length
            for (let i=len-1; i>=0; i--) { // 为了 DFS 所以需要反向遍历入栈
                node.children[i].level = node.level + 1
                stack.push(node.children[i])
            }
        }
    }
    return res
};

JS刷题记录 Leetcode-js (opens new window) 每周都会更新刷题心得或者题解, 你的点赞或 star 都将助力我产出更好内容~