Typescript-Algorithms
    Preparing search index...

    Variable flatten_binary_tree_to_linked_listConst

    flatten_binary_tree_to_linked_list: (root: null | TreeNode) => void = flatten

    114.二叉树展开为链表

    给你二叉树的根节点 root ,请你将它展开为一个单链表:

    • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个节点,而左子指针始终为 null
    • 展开后的单链表应该与二叉树先序遍历顺序相同。

    示例1

    输入: root = [1,2,5,3,4,null,6]

    输出: [1,null,2,null,3,null,4,null,5,null,6]


    输入: root = []

    输出: []


    输入: root = [0]

    输出: [0]


    • 树中结点数在范围 [0, 2000]
    • -100 <= Node.val <= 100

    • 你可以使用原地算法(O(1) 空间)展开这棵树吗?

    Type declaration

      • (root: null | TreeNode): void
      • Do not return anything, modify root in-place instead.

        Parameters

        • root: null | TreeNode

        Returns void

    核心思路: 利用前序遍历将二叉树展开为链表,使用一个全局指针 cur 来构建链表。

    算法步骤

    1. 初始化:创建一个虚拟节点 cur = new TreeNode(-1) 作为链表的起始点

    2. 前序遍历:使用DFS前序遍历(根-左-右)访问每个节点

    3. 链表构建

      • 将当前节点连接到 cur.right
      • 将当前节点的 left 设为 null
      • 更新 cur 为当前节点
    4. 递归处理:分别递归处理左子树和右子树

    关键实现细节

    • 使用全局变量 cur 追踪链表的当前末尾节点
    • 在访问每个节点时,将其添加到链表的末尾
    • 通过前序遍历确保节点按照正确顺序连接

    示例

    原始树
    1
    / \
    2 5
    / \ \
    3 4 6

    展开后
    1 -> 2 -> 3 -> 4 -> 5 -> 6

    时间复杂度:O(n)
    空间复杂度:O(h),其中h是树的高度

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

    /**
    * Do not return anything, modify root in-place instead.
    */
    function flatten(root: TreeNode | null): void {
    if (!root) {
    return;
    }

    let cur = new TreeNode(-1);

    function dfs(node: TreeNode | null) {
    if (!node) {
    return;
    }

    const l = node.left;
    const r = node.right;

    cur.right = node;
    node.left = null;
    cur = node;

    dfs(l);
    dfs(r);
    }

    dfs(root);

    root = cur.right;
    };