前端算法锦囊-Binary Tree Level Order Traversal

83 阅读2分钟

二叉树的层序遍历(Binary Tree Level Order Traversal)

题目描述:

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。

示例:

输入:
    3
   / \
  9  20
    /  \
   15   7

输出:
[
  [3],
  [9, 20],
  [15, 7]
]

解题思路:

  1. 广度优先搜索(BFS)

    • 使用队列实现层序遍历。
    • 每次遍历一层,将当前层的节点值存入结果数组。
    • 将下一层的节点加入队列,直到队列为空。
  2. 深度优先搜索(DFS)

    • 使用递归实现,记录当前层数。
    • 将节点值存入对应层的结果数组中。

代码实现(BFS):

function levelOrder(root) {
    if (root === null) return []; // 边界条件

    const result = []; // 存储结果
    const queue = [root]; // 初始化队列

    while (queue.length > 0) {
        const levelSize = queue.length; // 当前层的节点数
        const currentLevel = []; // 存储当前层的节点值

        for (let i = 0; i < levelSize; i++) {
            const node = queue.shift(); // 取出队头节点
            currentLevel.push(node.val); // 将节点值存入当前层
            if (node.left !== null) queue.push(node.left); // 将左子节点加入队列
            if (node.right !== null) queue.push(node.right); // 将右子节点加入队列
        }

        result.push(currentLevel); // 将当前层的结果存入最终结果
    }

    return result; // 返回结果
}

// 测试
function TreeNode(val) {
    this.val = val;
    this.left = this.right = null;
}

const root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);

console.log(levelOrder(root)); // 输出 [[3], [9, 20], [15, 7]]

代码实现(DFS):

function levelOrder(root) {
    const result = []; // 存储结果

    function dfs(node, level) {
        if (node === null) return; // 递归终止条件

        if (result.length === level) {
            result.push([]); // 如果当前层的结果数组不存在,创建一个新的
        }

        result[level].push(node.val); // 将节点值存入对应层
        dfs(node.left, level + 1); // 递归遍历左子树
        dfs(node.right, level + 1); // 递归遍历右子树
    }

    dfs(root, 0); // 从根节点开始遍历
    return result; // 返回结果
}

// 测试
const root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);

console.log(levelOrder(root)); // 输出 [[3], [9, 20], [15, 7]]

复杂度分析:

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。每个节点都会被访问一次。
  • 空间复杂度:
    • BFS:O(n),队列中最多存储一层的节点数。
    • DFS:O(h),其中 h 是二叉树的高度。递归调用栈的深度为树的高度。