LeetCode hot 100—二叉树展开为链表

传统芯片封装工艺流程简介 塑封是将工件和树脂安装在模具中,加热模具,使树脂液化充满模具,降温保持一定时间后,树脂凝结为固态即可取出。它将一个大的晶圆切割成许多单独的小块,每个小块是一个“芯片”(Chip,die),这些芯片是单个集成电路的基本单位。对裸露在外的引线框架外脚电镀Sn-Pb合金,这样不仅可以提高外脚的抗氧化性,还有利于后续与印刷电路板的焊接。导电胶粘贴法:将含有银粉的环氧树脂(银浆)涂敷在框架或基板上,再将芯片放置其上,固化后可以将芯片牢牢粘接。引线框架的各腿是用筋连接着的,起支撑作用,塑封固化后,需要将其连筋切掉。 阅读详情

题目

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

分析

为了解决将二叉树展开为与先序遍历顺序相同的单链表这一问题,可以使用递归的方法。递归地处理左子树和右子树,然后将它们连接起来形成单链表。

递归

时间复杂度:O(n),n 是二叉树的节点数

空间复杂度:O(n)

class Solution {
public:
    void flatten(TreeNode* root) {
        if (root == nullptr) return;
        // 递归处理左子树和右子树
        flatten(root->left);
        flatten(root->right);
        // 保存当前节点的右子树
        TreeNode* rightSubtree = root->right;
        // 将左子树移到右边
        root->right = root->left;
        root->left = nullptr;
        // 找到当前节点新的右子树的最右节点
        TreeNode* current = root;
        while (current->right != nullptr) {
            current = current->right;
        }
        // 将原来的右子树连接到新的右子树的最右节点
        current->right = rightSubtree;
    }
};

空间优化

如果要满足空间复杂度为 O(1),我们可以使用 Morris 遍历的思想。Morris 遍历是一种空间复杂度为 O(1) 的二叉树遍历方法,它通过利用树中的空闲指针来实现。

时间复杂度:O(n),n 是二叉树的节点数

空间复杂度:O(1)

class Solution {
public:
    void flatten(TreeNode* root) {
        TreeNode* current = root;
        while (current!= nullptr) {
            if (current->left!= nullptr) {
                // 找到当前节点左子树的最右节点
                TreeNode* pre = current->left;
                while (pre->right!= nullptr) {
                    pre = pre->right;
                }
                // 将当前节点的右子树接到左子树的最右节点的右子树上
                pre->right = current->right;
                // 将当前节点的左子树接到当前节点的右子树上
                current->right = current->left;
                // 左子树设为nullptr
                current->left = nullptr;
            }
            // 移动到当前节点的右子树
            current = current->right;
        }
    }
};
别再死记硬背了!一张图搞懂无刷电机半桥与全桥驱动的核心差异(附避坑指南) 本文深入解析无刷直流电机的半桥与全桥驱动方式的核心差异,提供直观对比与选型指南。半桥驱动结构简单、成本低,适合低要求场景;全桥驱动性能优越但复杂,适用于高精度控制。文章还包含实战避坑指南,帮助工程师优化驱动方案选择与应用。 阅读详情

相关推荐

单点DToF激光测距传感器各家产品的比较

汇总DToF 单点测距传感器的相关信息

Linux 设备驱动概述及开发环境构建 (一) 1775

LeetCode 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] class So.

baixiaohu123123的博客 413

推荐系统:NDCG评价指标及其Python实现方法

除了推荐任务,在二分类任务中,也可以计算该指标,代码如下: # ndcg def get_dcg(y_pred, y_true, k): #注意y_pred与y_true必须是一一对应的,并且y_pred越大越接近label=1(用相关性的说法就是,与label=1越相关) df = pd.DataFrame({"y_pred":y_pred, "y_true":y_true}) ...

lanyuelvyun的博客 8242

leetcode简单之1142.过去30天的活动II

Activity 表: Column Name Type user_id int session_id int activity_date date activity_type enum 该表没有主键,它可能有重复的行。 activity_type 列是 ENUM 类型,可以取(“ open_session”,“ end_session”,“ scroll_down”,“ send_message”)四种活动类型之一。 该表显示了社交媒体网站的用户活动。 请注意,每个会话只属

Janice的博客 536

MATLAB随机生成m个三维坐标点,且各个坐标点之间的距离不小于n

randi函数 randi(max,m,n); %生成均匀分布的随机整数,max生成的随机整数最大值,生成m行n列的矩阵 编写函数sampling function [x,y,z]=sampling(lowx,upx,lowy,upy,lowz,upz,m,n) %该函数用来产生不重复的随机整数矩阵 %low—随机整数下界;up—随机整数上界;m—坐标点个数;n—各个坐标点之间的最小距离 %编...

qq_45384561的博客 9436

SystemVue 链路预算、仿真分析步骤

使用SystemVue进行链路预算、频谱分析等,相对ADS更全面。

BeCourageable的博客 3836

JDK1.8源码解析-HashMap.TreeNode

在JDK 1.8 以前 HashMap 的实现是数组+链表,哈希函数很难保证元素的均匀分布。 当 HashMap 中有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,这个时候 HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势。 针对这种情况,JDK 1.8 中引入了 红黑树(查找时间复杂度为 O(logn))来优化这个问...

你好,我是橙序员 693

PMOS缓启动电路设计实战:用LTspice优化上电时序,把60A冲击降到15A

本文通过一个实战案例,深入解析了PMOS缓启动电路如何有效抑制上电冲击电流。文章指出,低ESR电容是导致冲击电流飙升的元凶,并详细阐述了利用LTspice仿真工具,通过优化栅极电阻和栅源电容等参数,将高达60A的冲击电流成功降至15A的设计与优化过程,为电源开关电路设计提供了可复用的方法论。

onion的博客 900

k叉树的性质_逻辑结构.树.红黑树(上)

引言 二叉查找树其实就是二分查找在数据结构上的体现,所以理想情况下在bst中搜索某个结点的时间复杂度为。但这只是理想情况,bst其实是不稳定的,若出现了斜树这种极端不平衡的情况,搜索复杂度就是线性的:此时的树就已经退化成了链表。所以,为了维护二叉树的平衡性,在每次插入删除后尽量保持树的高度在,就出现了AVL树、红黑树。今日就先来学习学习红黑树的插入操作部分。 红黑树 红黑树就是一种==...

weixin_39637571的博客 494

鸿蒙OS+UniApp文件上传实战:如何解决大文件分片上传的3大坑?

本文深入探讨鸿蒙OS与UniApp结合实现大文件分片上传的实战方案,重点解决分片策略设计、网络中断处理和进度管理三大技术难题。通过鸿蒙分布式特性与UniApp跨平台能力的结合,提供动态分片调整、断点续传和跨设备进度同步等优化方案,显著提升大文件上传成功率和用户体验。

weixin_29250403的博客 474

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 441

LeetCode-1142. 过去30天的用户活动 II(简单)

Table: Activity +---------------+---------+ | Column Name | Type | +---------------+---------+ | user_id | int | | session_id | int | | activity_date | date | | activity_type...

Hello_JavaScript的博客 1299

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 912

【力扣hot100题】(045)二叉树展开为链表

快服了我自己了怎么老是把右移节点写成一个l->right没有l=。

s478527548的博客 247

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Leetcode Hot100 第70题 114.二叉树展开为链表

【代码】Leetcode Hot100 第70题 114.二叉树展开为链表。

weixin_45850570的博客 416

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

leetcode_hot100二叉树展开为链表114

那么,左子树遍历的最后一个节点是谁呢?就是左子树里。

m0_74329301的博客 666

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

leetcode hot100-46 二叉树展开为链表

方法一:递归 + 反前序遍历。

m0_58625012的博客 202

力扣HOT100之二叉树:114. 二叉树展开为链表

这道题自己尝试着做了一下,感觉还是得用递归来做比较简单,但是一直想的是用前序遍历来构造链表,导致怎么做都不对,去看了下灵神的题解,然后问了下GPT,现在终于弄明白了。虽然构造出来的链表的排列顺序是按照前序遍历来排列的,但是在构造的时候不能用前序遍历,因为按照根 -> 左 -> 右的顺序遍历的话,我们需要将左孩子节点移到右孩子节点处,然后左孩子置空,这样右孩子就直接丢失了,就算我们用一个额外的变量来提前保存右子树也无法解决。处理节点 1 时,将 1 的左子树(2)移到右侧,原右子树(5)丢失。

weixin_52151595的博客 375

【leetcode hot 100 114】二叉树展开为链表

【代码】【leetcode hot 100 114】二叉树展开为链表。

longii11的博客 518

LeetCode Hot100 | Day5 | 二叉树右视图&&二叉树展开为链表

中右左,因为收集的是右视图,我们要收集最右边的,先递归右子树,保证首次遇到的一定是最右边的,有人可能会好奇,这样的话,遍历左子树的时候会有不符合条件的答案进去,深度就是解决这个问题的。深度首次遇到才会记录答案,这样避免了递归完右子树重新从根节点路过递归遍历左子树的时候,路过的重复深度的树层的树。这个在遍历完右子树后,如果左子树还有比右子树深度大的才会进入答案。用一个vector把前序遍历结点存储一下,然后再把它串成链表。思路好想,代码也是模板,不多说了。来自于灵神的题解,我仅仅是看懂。

m0_74795952的博客 561

力扣hot100 - 114、二叉树展开为链表

思路二:先递归地把左子树展开为一个链表,再记录一下右子树,左子树移到右子树位置,把记录的右子树放到左子树右节点。思路一:通过先序遍历将元素放到一个数组中,再去遍历数组同时构造一棵二叉树。

2402_83620793的博客 180

力扣Hot100-114二叉树展开为链表

思路:我们知道前序遍历的访问顺序为根->左->右,可以观察到在遍历时二叉树最左边的顺序就是访问顺序,只有当前访问的节点没有左节点时,才会开始访问右节点,所以,我们可以用pre记录前一个访问的节点, 站在pre节点的角度来看,若是pre没有左孩子,则下一个访问pre右分支上的节点Node,且可以将pre的左分支指向下一个访问的节点Node,实现将访问顺序记录到二叉树的左分支上,从根节点开始访问其左孩子,可以得到先序遍历的顺序。若pre节点有左孩子,下一个访问的即是pre的左孩子。额外空间)展开这棵树吗?

qq_52241267的博客 1184

【Leetcode hot 100】114.二叉树展开为链表

摘要: 题目要求将二叉树原地展开为单链表,保持先序遍历顺序。提供两种解法: 基础解法:先序遍历存储节点到列表,再重构链表(左空右指下个节点)。时间复杂度O(n),空间O(n)。 优化解法:原地调整指针,每次将左子树最右节点连接右子树,左子树移为右子树。时间O(n),空间O(1)。后者更高效但逻辑稍复杂,适合空间敏感场景。两种方法均确保链表顺序与先序遍历一致。

专注Java和MySQL领域知识分享 722

力扣Hot100系列12(Java)——[二叉树]总结(中)(验证二叉搜索树,二叉搜索树中第k小的元素,二叉树的右视图,二叉树展开为链表)

本文记录了力扣Hot100中关于二叉树的四道题目解析,重点介绍二叉搜索树的验证和中序遍历查找第k小元素。验证二叉搜索树通过递归检查节点值是否在合法区间内实现,使用长整型避免溢出。查找第k小元素采用非递归中序遍历,通过栈模拟遍历过程,在访问节点时计数直到k=0。文中通过具体示例(如验证合法/非法BST、查找BST第5小元素)详细说明了算法执行流程和关键步骤判断逻辑。两种解法均体现了二叉树遍历的核心思想,具有O(n)时间复杂度和O(h)空间复杂度。

2402_89049045的博客 883

[力扣 Hot100]二叉树展开为链表

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

qq_53627591的博客 576

LeetCode Hot 100 二叉树展开为链表

本文提出了将二叉树展开为单链表的算法。展开后的链表应使用TreeNode结构,其中right指针指向下一个节点,left指针始终为null,且链表顺序与二叉树先序遍历相同。提供的解决方案采用递归方法:后序遍历二叉树,每次处理节点时将其左右子树展开,然后将右子树接到左子树末尾,最后将处理好的左子树作为当前节点的右子树。算法时间复杂度为O(n),空间复杂度为O(n)。示例展示了不同输入情况下的输出结果。

2302_76776557的博客 321
上一篇: LeetCode hot 100—分割等和子集
下一篇: LeetCode hot 100—最长有效括号
rigidwill666
博客等级 码龄7年 508粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rigidwill666

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值