当前位置: 首页 > news >正文

Leecode hot100 - 114. 二叉树展开为链表 基础方法到提高方法

题目描述

https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/?envType=problem-list-v2&envId=2cktkvj

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

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

示例 1:

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

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [0]
输出:[0]

思路

“改造” 树的结构,让树变成单链表形态(左指针全为 null,右指针串联所有节点)

代码(基础)

class Solution:
    def flatten(self, root: Optional[TreeNode]) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        # 先序遍历收集节点(颜色标记法)
        white, gray = 0, 1
        res = []
        stack = [(root, white)]  # 使用元组
        
        while stack:
            node, color = stack.pop()
            if node is None:
                continue
                
            if color == white:
                # 保持与栈初始化一致的元组形式
                stack.append((node.right, white))
                stack.append((node.left, white))
                stack.append((node, gray))
            else:
                res.append(node)
        
        # 串联节点,构建单链表
        for i in range(len(res)):
            if i < len(res) - 1:
                res[i].right = res[i+1]
            else:
                res[i].right = None
            res[i].left = None
        return root

代码(优化)

class Solution:
    head = None
    def flatten(self, root: Optional[TreeNode]) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        if root is None:
            return 
        # 后序遍历:先处理右子树,再处理左子树
        self.flatten(root.right)
        self.flatten(root.left)
        # 头插法构建单链表
        root.left = None  # 左指针置空
        root.right = self.head  # 当前节点右指针指向已构建的链表头部
        self.head = root  # 更新链表头部为当前节点

复杂度分析

两种代码均为O(n)

  • 时间复杂度:O(n),其中 n 是二叉树的节点个数。

  • 空间复杂度:O(n)。递归需要 O(n) 的栈空间。

http://www.dtcms.com/a/395148.html

相关文章:

  • 把 iOS 混淆纳入自动化测试与 CICD 从构建、回归到灰度的工程化实战
  • 初识Redis:解锁高性能缓存的魔法钥匙
  • 基于传递矩阵法计算多层结构声表面波声速
  • 中间件和分类
  • MV2DFusion:利用模态特定目标语义进行多模态三维检测
  • BeanFactory接口作用(二)
  • 速通ACM省铜第十二天 赋源码(Kirei Attacks the Estate)
  • 海外仓一件代发怎样优化拣货流程?用什么WMS能减少错拣漏拣?
  • SQL Server 定时作业
  • 大模型笔试选择题:题组1
  • 关于STL
  • clickhouse使用问题记录
  • Java 大视界:基于 Java 的大数据实时流处理在金融高频交易数据分析中的创新应用
  • 【脑电分析系列】第25篇:情绪识别与认知研究中的EEG应用:一个完整的实验设计与数据分析流程
  • Tensorflow基础——数据类型、计算图
  • 在Anaconda中安装TensorFlow1.14.0与TensorFlow2.0.0
  • 面试题:分布式锁要点总结(Redisson)
  • C++第四篇:函数增强
  • C#上位机软件:1.7 熟悉VS并开启你的第一个C#程序
  • Nextcloud App增加模块内嵌网页
  • 04-django配置日志-loguru
  • docker离线部署gpt-oss-20b流程,从下载到安装再到可以使用
  • 关系数据库MySQL的常用基础命令详解实战
  • 面向动态环境的MEC突破:MLGO微算法科技推出自适应权重深度确定性策略梯度(AWDDPG)算法,革新多用户任务迁移技术
  • Ansys Zemax | 确保自由曲面设计的可制造性
  • 智造新势力:看“文化+科技”如何重塑制造新范式
  • 【算法训练营Day25】动态规划part1
  • 打破网络壁垒:使用内网穿透轻松实现远程桌面访问
  • 2025 PyCharm IDE 社区版与专业版合并后,新手该如何安装?(附 Toolbox 图形化安装教程)
  • 07-css元素定位布局