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)

相关推荐
专吃海绵宝宝菠萝屋的派大星8 分钟前
使用Dify对接自己开发的mcp
java·服务器·前端
爱分享的阿Q8 分钟前
Rust加WebAssembly前端性能革命实践指南
前端·rust·wasm
蓝黑20209 分钟前
Vue的 value=“1“ 和 :value=“1“ 有什么区别
前端·javascript·vue
小李子呢021118 分钟前
前端八股6---v-model双向绑定
前端·javascript·算法
He少年33 分钟前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
史迪仔011236 分钟前
[QML] QML IMage图像处理
开发语言·前端·javascript·c++·qt
AwesomeCPA40 分钟前
Miaoduo MCP 使用指南(VDI内网环境)
前端·ui·ai编程
前端大波42 分钟前
前端面试通关包(2026版,完整版)
前端·面试·职场和发展
qq_433502181 小时前
Codex cli 飞书文档创建进阶实用命令 + Skill 创建&使用 小白完整教程
java·前端·飞书
IT_陈寒1 小时前
为什么我的Vite热更新老是重新加载整个页面?
前端·人工智能·后端