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)

相关推荐
H_Lisa几秒前
我用 Express 写了个 MCP,Claude 直接调用我的 API 了
前端
IT_陈寒7 分钟前
React的useEffect依赖数组把我坑惨了
前端·人工智能·后端
兰亭妙微UI设计公司1 小时前
兰亭妙微ui设计公司分享:B端组件命名如何支持团队协作
前端·javascript·vue.js
云和数据.ChenGuang2 小时前
光哥说Python 异常深度解析:从异常模型到工程化实践
java·前端·人工智能·python·langchain
小大宇2 小时前
Vue知识点-ElementPlus-03提示框+询问+通知
前端·javascript·vue.js
j7~3 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
步行cgn3 小时前
Axios 请求成功但页面不显示:两个前端错误的分析与修正
前端
时间的情敌3 小时前
WebGIS + OpenLayers + GeoServer + PostGIS #量算 #点聚合
前端·geoserver·openlayers
Shaoshing4 小时前
LeetCode100 42.接雨水
java·算法·leetcode
不可能片场4 小时前
Electron 发布 cookie 库先查明文再写解密
前端·electron