Skip to content

114. 二叉树展开为链表 ​

  • 题号:114
  • 来源:LeetCode
  • 难度:中等
  • 标签:树 DFS 链表
  • 语言:TypeScript
  • 解法:2 个
  • 作者:lmliheng
  • 最近更新:2026-09-27

解法一 ​

TypeScript · O(n) 时间 · O(n) 空间 · 更新于 2026-09-27

先序收集节点值,再串成右链的新树

typescript
/**
 * @difficulty medium
 * @tags 树,DFS,链表
 * @time O(n)
 * @space O(n)
 * @note 先序收集节点值,再串成右链的新树
 * @114. 二叉树展开为链表
 */

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)
    }
}

let root: TreeNode | null = new TreeNode(1, new TreeNode(2, new TreeNode(3, null, null), new TreeNode(4, null, null)), new TreeNode(5, null, new TreeNode(6, null, null)))

if (root === null) {
    console.log(null)
} else {
    let arr: number[] = []
    const bfs = (root: TreeNode | null): void => {
        if (root === null) {
            return
        }
        arr.push(root.val)
        if (root.left) {
            bfs(root.left)
        }
        if (root.right) {
            bfs(root.right)
        }
    }

    bfs(root)

    root = new TreeNode(arr[0])
    let n: number = 0

    const CreateTree = (root: TreeNode): void => {
        if (n >= arr.length - 1) {
            return
        }
        root.right = new TreeNode(arr[n+1])
        n++
        CreateTree(root.right)
    }
    CreateTree(root)

    console.log(arr)
    console.log(root)
}

export {};

源码:ts/leetcode/114. 二叉树展开为链表.ts

解法二 · TypeScript ​

TypeScript · O(n) 时间 · O(n) 空间 · 更新于 2026-09-27

先序收集节点引用,原地重连 left/right

typescript
/**
 * @difficulty medium
 * @tags 树,DFS,链表
 * @time O(n)
 * @space O(n)
 * @note 先序收集节点引用,原地重连 left/right
 * @114. 二叉树展开为链表(解法二)
 */

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)
    }
}

// 收集节点
let root: TreeNode | null = new TreeNode(1, new TreeNode(2, new TreeNode(3, null, null), new TreeNode(4, null, null)), new TreeNode(5, null, new TreeNode(6, null, null)))

if (root === null) {
    console.log(null)
} else {
    let arr: TreeNode[] = []
    const bfs = (root: TreeNode | null): void => {
        if (root === null) {
            return
        }
        arr.push(root)
        if (root.left) {
            bfs(root.left)
        }
        if (root.right) {
            bfs(root.right)
        }
    }

    bfs(root)

    // 重新连接节点
    for (let i = 0; i < arr.length - 1; i++) {
        arr[i].left = null;
        arr[i].right = arr[i + 1];
    }

    // 最后一个节点的左右子树设为null
    if (arr.length > 0) {
        arr[arr.length - 1].left = null;
        arr[arr.length - 1].right = null;
    }

    console.log(root)
}

export {};

源码:ts/leetcode/114. 二叉树展开为链表(解法二).ts


在 GitHub 上查看题目所在目录:lmliheng/algorithm