算法114. 二叉树展开为链表

题目:

给你二叉树的根结点 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]

提示:
树中结点数在范围 [0, 2000] 内
-100 <= Node.val <= 100

解法一:后序遍历+头插法

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:head=Nonedef 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

思路:
先把按照后序遍历,右子树->左子树->根节点,比如6-5-4-3-2-1,从右子树最后一个节点6开始,后续节点依次指向前一个节点,1-2-3-4-5-6。
解释最后三步:

📌 (1) root.left = None
题目要求最终树变成右链表,左子树必须为空,所以直接清空。

📌 (2) root.right = self.head
self.head 是 已经处理完的“后半部分链表”的头节点。
现在我们要把 root 接到这个链表的前面。
所以让 root.right 指向 self.head,相当于把 root 插到链表头部。
📌 (3) self.head = root
更新头节点为 root,因为 root 现在是链表最前面的节点。


解法二:分治

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def flatten(self, root: Optional[TreeNode]) -> None:"""Do not return anything, modify root in-place instead."""if root is None:return None# 左子树尾节点left_tail = self.flatten(root.left)# 右子树尾节点right_tail = self.flatten(root.right)if left_tail:# 左子树的尾要指向右子树的头left_tail.right = root.right# 根节点的尾要指向左子树的头root.right=root.left# 清空左指针root.left=Nonereturn right_tail or left_tail or root

核心逻辑:拼接三部分
我们要把整棵树展平,顺序是:

root → 左子树链表 → 右子树链表

所以我们需要:

  • 把 root 的右指针指向左子树链表的头(即 root.left)
  • 把左子树链表的尾(left_tail)指向右子树链表的头(即原来的 root.right)
  • 清空左子树指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919720.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧能源管理系统:点亮山东零碳园区的绿色引擎

一、概述在全球积极践行“双碳”目标的时代浪潮下&#xff0c;山东作为经济大省&#xff0c;正全力推动产业的绿色变革&#xff0c;零碳园区建设成为其中的关键一环。《山东省零碳园区建设方案》明确规划&#xff0c;到2027年建成15个左右省级零碳园区 &#xff0c;到2030年进一…

分布式日志分析平台(ELFK 与 EFK)理论

一、日志分析平台核心概念在分布式系统中&#xff0c;日志是系统运行状态监控、问题排查和业务分析的重要依据。随着系统规模扩大&#xff0c;单机日志管理方式已无法满足需求&#xff0c;分布式日志分析平台应运而生。其核心目标是实现日志的集中收集、统一处理、高效存储和可…

CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行本地操作--读取店铺信息(6)

本节内容&#xff0c;使用登录的token进行店铺信息读取&#xff0c;顺利的话&#xff0c;进行EXCEL上传测试。 1。在后台编写 读取店铺信息代码 1.1 查看原来铺店信息在什么位置&#xff0c;店铺的表格为CoreCmsStore#region 获取列表// POST: Api/CoreCmsStore/GetPageList///…

UE5关卡蓝图能不能保存副本呀?

提问 关卡蓝图能不能保存副本呀&#xff1f; 回答 在 UE 里&#xff0c;“关卡蓝图&#xff08;Level Blueprint&#xff09;”本身其实是不能直接复制/保存成独立资源的&#xff0c;因为它和具体的 **Level&#xff08;.umap 文件&#xff09;**是绑定的——相当于一个“场景脚…

机器学习数据预处理学习报告

一、学习背景与目的在机器学习流程中&#xff0c;数据预处理是保障模型训练效果的关键环节。原始数据常存在缺失值、量纲不一致、特征格式不匹配等问题&#xff0c;直接影响模型对数据规律的学习。本次学习围绕 Pandas 与 Scikit-learn&#xff08;sklearn&#xff09;工具库&a…

git旧仓库迁移到新仓库

git旧仓库迁移到新仓库 A仓库(旧仓库)&#xff1a;git172.16.21.21:xxxx_software/Ni-Handler-Mgr.git B仓库(新仓库)&#xff1a;git172.16.11.11:yyyy/hostpc/ni-handler-mgr.git Step1 新建新仓库 创建新 GitHub 仓库‌ 在 GitHub 页面点击 “New repository”&#xff0c;命…

YOLO --- YOLOv5模型以及项目详解

YOLO — YOLOv5模型以及项目详解 文章目录YOLO --- YOLOv5模型以及项目详解一&#xff0c;开源地址二&#xff0c;改进点Focus 模块三&#xff0c;网络结构3.1 CSP1_X 与 CSP2_X3.2 自适应Anchor的计算3.3 激活函数3.3.1 SiLU3.3.2 Swish3.4 Bottleneck3.5 C33.5.1 BottleneckC…

Linux文本三剑客的使用及常见重点操作

文本三剑客指 Linux环境下的 grep&#xff08;搜索&#xff09;、sed&#xff08;编辑&#xff09;、awk&#xff08;分析&#xff09;三款用于文本处理的核心命令&#xff0c;三者分工明确、功能互补&#xff0c;是处理日志、配置文件、结构化数据等场景的 “刚需工具”。一、…

​​《开源字幕神器VideoCaptioner实战:基于Whisper+LLM的全链路方案,免费平替剪映会员》​​

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;每天分享好用实用且智能的开源项目&#xff0c;以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对您有所帮助&#xff0c;请帮我点个小赞小收藏小关注吧&#xff0c;谢谢喲&#xff01;&#x1f618; 博主…

redisIO模型

​​1. 总述核心​​“Redis采用了​​单线程的Reactor模型​​来处理网络IO和命令请求。其核心在于&#xff0c;​​它使用一个主线程通过IO多路复用机制来并发地处理大量的客户端连接&#xff0c;而实际的命令解析和执行则是单线程的​​。”这句话非常重要&#xff0c;它直接…

视觉采集模块的用法

一、图像源模块用法采集模块中最基础的单元就是图像源模块&#xff0c;其中图像的输入方式包括相机输入、本地图像、SDK三种。添加图像源后&#xff0c;需要对内部的参数进行对应的配置&#xff0c;正常我们连接相机后图像源选择我们对应的连接相机。配置所需要的相机参数&…

Linux下基于Electron的程序ibus输入法问题

Linux下基于Electron的程序ibus输入法问题 最近想体验一下KDE Plasma桌面&#xff0c;遇到一个问题&#xff0c;就是浏览器输入不了中文&#xff0c;Edge、Chrome都一样&#xff0c;当然它们都是基于Chromium的&#xff0c;出同样的问题很正常。后面发现Visual Code也有同样的问…

Ubuntu20系统上离线安装MongoDB

Ubuntu20系统上离线安装MongoDB 准备工作&#xff1a;下载安装包及依赖​ 下载MongoDB二进制包​ 在联网环境中访问MongoDB官网&#xff0c;选择以下配置&#xff1a; 下载地址&#xff1a;https://www.mongodb.com/try/download/community ​Version​&#xff1a;需与目标系统…

K-Means 聚类算法如何选择初始点

n_clusters 参数是告诉 K-Means 算法对 整个数据集 (X_scaled) 进行分簇。让我们分解一下这个过程的逻辑&#xff1a;目标&#xff1a;我们的目标不是要对数据进行分类&#xff0c;而是要从成百上千个数据点中&#xff0c;智能地挑选出大约30个点作为贝叶斯优化的“起点”。这些…

聚铭安全管家平台2.0实战解码 | 安服篇(四):重构威胁追溯体系

在企业安全运营中&#xff0c;两类问题常常让团队陷入被动 1、“看得见威胁&#xff0c;却追不到源头” 明明检测到多台内网设备遭攻击&#xff0c;却迟迟找不到攻击源头&#xff0c;更说不清攻击者用了什么手法&#xff0c;导致无法及时封禁或隔离。 2、“找到了源头&#xff…

【Microi吾码】:低代码加速业务和技术深度融合

目录 一.低代码优势&#xff1a; 1.1低代码平台和传统代码开发&#xff1a; 1.2低代码和0代码平台&#xff1a; 1.3低代码平台&#xff1a;Microi吾码 二.关于开源低代码平台&#xff1a;Microi吾码 2.1Mircroi吾码介绍&#xff1a; 2.2产品特点&#xff1a; 2.3产品团…

Mongodb操作指南

一、数据库操作1. 展示所有非空数据库show dbs该命令会列出所有包含数据的数据库。2. 显示当前数据库db此命令用于查看当前正在使用的数据库。3. 切换或创建数据库use 数据库名如果指定的数据库不存在&#xff0c;MongoDB 会在首次插入数据时自动创建它。如果已存在&#xff0c…

线性回归计算

一、理论&#xff1a;明确线性回归的核心逻辑模型本质&#xff1a;线性回归是通过属性的线性组合实现预测的模型&#xff0c;核心目标是找到最优的直线&#xff08;单变量&#xff09;、平面&#xff08;双变量&#xff09;或超平面&#xff08;多变量&#xff09;&#xff0c;…

pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。

解决办法 1、以管理员身份运行window powershell 2、执行Get-ExecutionPolicy&#xff0c;显示Restricted 3、执行set-ExecutionPolicy&#xff0c;会提示输入参数&#xff0c;此时输入RemoteSigned回车 4、执行y回车

[特殊字符] TTS格局重塑!B站推出Index-TTS,速度、音质、情感表达全维度领先

B站维度之言&#xff1a;B 站 2025 新声计划&#xff1a;IndexTTS 全维度拆解 ——从开源血统到中文特调的架构复盘1&#xff1a;打破边界&#xff1a;Index-TTS 的技术动因场景野心&#xff1a;直播实时口播、无障碍字幕、AI 虚拟 UP 主……B 站需要一把“声音瑞士军刀”&…