算法(TS):二叉树的层序遍历

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

示例一

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

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

解法

解法一

维护一个队列存放二叉树中的节点,同一层的节点从左到右连续放在一起。先将root放入队列,外层循环用while语句判断队列是否为空,将队列当前的长度保存在一个变量 size 中,size的值是本层节点的个数,内层循环用 while 判断size是否为0,在内层循环体中取出队首的节点node,将node的值push到需要返回的数据中,并将node.left 和 node.right push 到队尾。实现如下:

ts 复制代码
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function levelOrder(root: TreeNode | null): number[][] {
    if (!root) return []
    const stack: TreeNode[] = [root]
    const result: number[][] = []
    while(stack.length) {
        let size = stack.length
        const values:number[] = []
        while(size) {
            const node = stack.shift()
            values.push(node.val)
            if(node.left) {
                stack.push(node.left)
            }
            if (node.right) {
                stack.push(node.right)
            }
            size--
        }

        result.push(values)
    }

    return result
};

时间复杂度O(n),空间复杂度O(n)

解法二

用递归改造解法一。将解法一中的外层while和队列用递归代替

ts 复制代码
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function levelOrder(root: TreeNode | null): number[][] {
    const result: number[][] = []
    const conputed = (nodes: TreeNode[],values:number[][]) => {
        const levelValues: number[] = []
        const childrens: TreeNode[] = []
        while(nodes.length) {
            const node = nodes.shift()
            levelValues.push(node.val)
            if (node.left) {
                childrens.push(node.left)
            }
            if (node.right) {
                childrens.push(node.right)
            }
        }
        if (levelValues.length) {
            values.push(levelValues)
        }
        if (childrens.length) {
            conputed(childrens,values)
        }
    }

    if (root) {
        conputed([root],result)
    }
    return result
};

时间复杂度O(n),递归需要占用栈空间,空间复杂度O(height),height 是二叉树的最大深度

相关推荐
lingran__1 分钟前
算法沉淀第四天(Winner)
c++·算法
AIzealot无4 分钟前
Qwen3 Embedding报告随笔
人工智能·深度学习·算法·论文·embedding·论文笔记·搜广推
zzzsde5 分钟前
【C++】深入理解string类(5)
java·前端·算法
清风wxy28 分钟前
C语言基础数组作业(冒泡算法)
c语言·开发语言·数据结构·c++·windows·算法
IT小番茄29 分钟前
Kubernetes云平台管理实战:如何创建Deployment更好(九)
算法
白云千载尽1 小时前
leetcode 2598 执行操作后最大MEX
算法·leetcode·职场和发展
岁月向前1 小时前
网络数据大端序和小端序
算法
懒羊羊不懒@1 小时前
算法入门数学基础
c语言·数据结构·学习·算法
mit6.8241 小时前
[Sora] 从检查点恢复训练 | `Booster`接口 | EMA模型 | .safetensors
人工智能·算法·机器学习
CoovallyAIHub2 小时前
清华Mars Lab发布SLAM-Former:用一个Transformer统一SLAM的前端与后端(附项目地址)
深度学习·算法·计算机视觉