46.二叉树展开为链表

题目链接

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

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null

展开后的单链表应该与二叉树 先序遍历 顺序相同。

解法1 暴力解法

思路

和之前链表的思路一致,先将节点缓存到数组当中。之后再去改变其结构。

不过要注意的是遍历的顺序是先序遍历。

代码

js 复制代码
function flatten(root: TreeNode | null): void {
    if (!root) return;
    const list = [];
    const preorder = (node) => {
        if (!node) return;
        list.push(node);
        preorder(node.left);
        preorder(node.right);
    };

    preorder(root);
    for (let i = 0; i < list.length; i++) {
        list[i].left = null;
        list[i].right = list[i + 1];
    }

    // 最后一个节点也需要置空其左右子树
    const last = list[list.length - 1];
    last.left = null;
    last.right = null;
};

时空复杂度

时间复杂度:O(n)

空间复杂度:O(n)

解法2 莫里斯原地修改

思路

Morris 遍历的核心思想是左子树右移 + 接尾巴

原理:

对于每个当前节点 curr

  1. 如果 curr 有左子树:
  • 找到它左子树中最右边的节点 predecessor
  • curr.right 接到这个 predecessor.right
  • curr.left 移动到 curr.right,然后置空 curr.left
  1. curr 往右移。

代码

js 复制代码
function flatten(root: TreeNode | null): void {
    if (!root) return;
    let curr = root;

    while (curr) {
        if (curr.left) {
            // 找到左子树的最右节点
            let pre = curr.left;
            while (pre.right) {
                pre = pre.right;
            }

            // 将 curr 的右子树接到 pre.right
            pre.right = curr.right;

            // 把左子树移到右边
            curr.right = curr.left;
            curr.left = null;
        }

        // 移动到下一个节点
        curr = curr.right;
    }
};

时空复杂度

时间复杂度:O(n)

空间复杂度:原地修改 O(1)

相关推荐
冻感糕人~7 分钟前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
程序员agions10 分钟前
2026年,“配置工程师“终于死绝了
前端·程序人生
alice--小文子17 分钟前
cursor-mcp工具使用
java·服务器·前端
晚霞的不甘25 分钟前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小迷糊的学习记录35 分钟前
0.1 + 0.2 不等于 0.3
前端·javascript·面试
历程里程碑1 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
梦帮科技1 小时前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
iAkuya2 小时前
(leetcode)力扣100 61分割回文串(回溯,动归)
算法·leetcode·职场和发展
VT.馒头2 小时前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
css趣多多2 小时前
一个UI内置组件el-scrollbar
前端·javascript·vue.js