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)

相关推荐
人工智能培训29 分钟前
大语言模型:从语言理解到通用智能的跃迁
linux·服务器·前端·人工智能
木井巳34 分钟前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
一拳不是超人40 分钟前
做独立开发三个月,我的第一个产品终于有了 1000 个用户
前端·程序员
Amos_Web1 小时前
Rspack 源码解析(十):Hash 与 Asset 生成
前端·rust·源码阅读
福兮说1 小时前
用 IndexedDB 存用户的文件,我踩过的五个坑
前端·javascript
闪耀之光M781 小时前
前端依赖自动导入:unplugin-auto-import
前端
Ricon组态薄荷糖1 小时前
Ricon组态系统:工业组件开发指南与实践
前端·后端·物联网
flash俊杰1 小时前
Electron 桌面应用的进程模型:为什么 fork Next.js standalone
前端
沙蒿同学1 小时前
我把架构约定编译成了会变红的测试:Wails v2 + Go + Vue3 桌面脚手架实战
前端·后端·github
cpolar技术支持1 小时前
本地 Playwright 测试报告怎么远程复盘?Trace Viewer 跑起来后,用 cpolar 分享失败现场
前端·自动化测试·测试工具·cpolar·playwright