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

LeetCode 热题 100_二叉树展开为链表(46_114_中等_C++)(二叉树;先序遍历(递归+数组);先序遍历(递归))

LeetCode 热题 100_二叉树展开为链表(46_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

题解:

解题思路:

思路一(先序遍历(递归+数组)):

1、在进行先序遍历的时候先将结点的信息存储到数组中,通过数组中的先后顺序更新每个结点的指向。

2、复杂度分析:
① 时间复杂度:O(n),n为二叉树中节点的个数,需遍历一遍二叉树O(n),遍历一遍数组更改指针的指向O(n)。
② 空间复杂度:O(n),递归遍历所需空间最多为O(n),一个额外的数组存储二叉树的信息O(n)。

思路二(先序遍历(非递归)):

1、如果我们采用非递归的方式,当我们遍历到一个结点时,我们就可以用一个指针来记录先序遍历中上一个结点的信息,通过修改上一个结点的指向来转换成单链表。

3、复杂度分析
① 时间复杂度:O(n),n为二叉树中节点的个数,需遍历一遍二叉树O(n)。
② 空间复杂度:O(n),先序遍历的非递归实现需要借助栈实现,最坏情况下栈中有n个结点信息。

代码实现

代码实现(思路一(先序遍历(递归+数组))):
//方法一(递归):采用递归的前序遍历将遍历的结点存储在数组中,然后修改指针的指向
void flatten1(TreeNode* root) {//nums_TreeNode存放先序遍历各节点的顺序vector<TreeNode *>nums_TreeNode;//先序遍历将结点信息存储在nums_TreeNode中preorder(root,nums_TreeNode);//根据nums_TreeNode中结点的顺序更改结点的指向for (int i = 1; i < nums_TreeNode.size(); i++){nums_TreeNode[i-1]->left=nullptr;nums_TreeNode[i-1]->right=nums_TreeNode[i];}
}//先序遍历将结点信息存储在nums_TreeNode中
//注意vector<TreeNode *>&nums_TreeNode这里的引用(&)
void preorder(TreeNode *root,vector<TreeNode *>&nums_TreeNode){if(root==nullptr) return;nums_TreeNode.emplace_back(root);preorder(root->left,nums_TreeNode);preorder(root->right,nums_TreeNode);
}
代码实现(思路二(先序遍历(非递归))):
//方法二:非递归先序遍历,pre代表当前遍历结点的前一个结点,改变pre左右孩子结点的指向
void flatten2(TreeNode* root) {if(root==nullptr) return ;stack<TreeNode *>stk;stk.push(root);//存放展开单链表的末尾TreeNode *tail=nullptr;while (!stk.empty()){TreeNode *node=stk.top();stk.pop();//更改结点的指向if(tail!=nullptr) {tail->left=nullptr;tail->right=node;}//注意右子结点先入栈if(node->right!=nullptr) stk.push(node->right);if(node->left!=nullptr) stk.push(node->left);//更新单链表的尾结点tail=node;}
}
以思路一为例进行调试
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(int val):val(val),left(nullptr),right(nullptr){}TreeNode(int val,TreeNode *left,TreeNode *right):val(val),left(left),right(right){}
};//通过数组创建二叉树,数组中-1代表nullptr
TreeNode *createTree(vector <int> nums){if (nums.empty()) return nullptr;TreeNode *root=new TreeNode(nums[0]);queue<TreeNode *> q;q.push(root);int i=1;while (i<nums.size()){//注意这里不能用root,会改变root的指向TreeNode *node=q.front();q.pop();if(i<nums.size()&&nums[i]!=-1){node->left=new TreeNode(nums[i]);q.push(node->left);}++i;if(i<nums.size()&&nums[i]!=-1){node->right=new TreeNode(nums[i]);q.push(node->right);}++i;}return root;
}//中序遍历输出二叉树,用于验证二叉树是否创建正确
void inorder_Traversal(TreeNode *root){if(root==nullptr) return;   inorder_Traversal(root->left);cout<<root->val<<" ";inorder_Traversal(root->right);
}class Solution
{
public://方法一(递归):采用递归的前序遍历将遍历的结点存储在数组中,然后修改指针的指向void flatten1(TreeNode* root) {vector<TreeNode *>nums_TreeNode;preorder(root,nums_TreeNode);for (int i = 1; i < nums_TreeNode.size(); i++){nums_TreeNode[i-1]->left=nullptr;nums_TreeNode[i-1]->right=nums_TreeNode[i];}}//注意vector<TreeNode *>&nums_TreeNode这里的引用(&)void preorder(TreeNode *root,vector<TreeNode *>&nums_TreeNode){if(root==nullptr) return;nums_TreeNode.emplace_back(root);preorder(root->left,nums_TreeNode);preorder(root->right,nums_TreeNode);}
};int main(){vector<int> nums={1,2,5,3,4,-1,6};//通过数组创建二叉树,-1为nullptrTreeNode* root=createTree(nums);//测试二叉树是否创建正确//inorder_Traversal(root);//二叉树展开为链表Solution s;s.flatten2(root);//输出转换的单链表while (root!=nullptr){cout<<root->val<<"->";root=root->right;}cout<<"nullptr";return 0;
}

LeetCode 热题 100_二叉树展开为链表(46_114)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

相关文章:

LeetCode 热题 100_二叉树展开为链表(46_114_中等_C++)(二叉树;先序遍历(递归+数组);先序遍历(递归))

LeetCode 热题 100_二叉树展开为链表&#xff08;46_114&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;先序遍历&#xff08;递归数组&#xff09;&#xff09;&#xff1a;思路二&#xff08;先序遍历&am…...

uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能

在原card组件的cover属性添加图片的话&#xff0c;无法在图片上面绑定 show-menu-by-longpress"true"属性&#xff0c;通过将图片自定义添加可使用该属性。 代码&#xff1a; <uni-card title"标题" padding"10px 0" :thumbnail"avata…...

最好用的图文识别OCR -- PaddleOCR(2) 提高推理效率(PPOCR模型转ONNX模型进行推理)

在实际推理过程中&#xff0c;使用 PaddleOCR 模型时效率较慢&#xff0c;经测试每张图片的检测与识别平均耗时超过 5 秒&#xff0c;这在需要大规模自动化处理的场景中无法满足需求。为此&#xff0c;我尝试将 PaddleOCR 模型转换为 ONNX 格式进行推理&#xff0c;以提升效率。…...

Redis--20--大Key问题解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 大Key问题1.什么是 Redis 大 Key&#xff1f;在 Redis 中&#xff0c;大 Key 是指单个键值对的数据量非常大&#xff0c;可能包含大量数据。 2. Redis大Key的危害3.…...

新版2024AndroidStudio项目目录结构拆分

如题 下载了最新版的android studio 发现目录结构和以前不一样 自动帮你合并了 如何层层抽丝剥茧呢 按照一下步骤即可解决问题&#xff01;...

STM32内置Flash

一、原理 利用flash存储用户数据需要注意查看&#xff0c;用户数据是否会覆盖芯片运行程序。 IAP&#xff08;在程序中编程&#xff09;利用程序修改程序本身&#xff0c;和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP&#xff08;在电路中编程&#xff0c;通…...

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)

关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…...

【Linux】深入理解进程信号机制:信号的产生、捕获与阻塞

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 时间不语&#xff0c;却回答了所有问题 目录 &#x1f4da;前言 &#x1f4da;一、信号的本质 &#x1f4d6;1.异步通信 &#x1f4d6;2.信…...

前端基础技术全解析:从HTML前端基础标签语言开始,逐步深入CSS样式修饰、JavaScript脚本控制、Ajax异步通信以及WebSocket持久通信

目录 前言&#xff1a; 1.前端技术html简单了解&#xff1a; 1.1HTML代码是由标签构成的。 1.2.HTML 文件基本结构 1.3.HTML 常见标签 标题标签: 段落标签: p 文本格式化标签 图片标签&#xff1a; 超链接标签: a 测试代码&#xff1a; 展示效果&#xff1a; 表单…...

Linux存储管理之核心秘密(The Core Secret of Linux Storage Management)

Linux存储管理之核心秘密 如果你来自Windows环境&#xff0c;那么Linux处理和管理存储设备的方式对你而言可能显得格外不同。我们知道&#xff0c;Linux的文件系统并不采用Windows那样的物理驱动器表示方式&#xff08;如C:、D:或E:&#xff09;&#xff0c;而是构建了一个以&…...

excel精简使用工具

1.获取sheet1的行填充到sheet2的列 希望在 Excel 中使用 INDEX 函数从不同的列中提取数据&#xff0c;并且每一行都引用不同的列。为了实现这个目标&#xff0c;你可以使用 COLUMN 函数来动态获取列的偏移量。 为了避免手动输入每个单元格的公式&#xff0c;你可以使用以下公…...

Flutter鸿蒙化 在鸿蒙应用中添加Flutter页面

前言 今天这节课我们讲一下 在鸿蒙应用中添加Flutter页面。 作用: 之前有很多朋友和网友问我鸿蒙能不能使用Flutter开发,他们的项目已经用Flutter开发成熟了有什么好的方案呢,今天讲到这个就可以很好的解决他们的问题,例如我们正式项目中可能是一部分native 开发 一部分…...

为什么页面无法正确显示?都有哪些HTML和CSS相关问题?

页面无法正确显示可能由多种原因导致&#xff0c;通常与HTML和CSS的结构、语法错误、浏览器兼容性、资源加载等问题有关。以下是一些常见的原因及其解决方法&#xff0c;结合实际项目代码示例进行讲解&#xff1a; 1. HTML 结构错误 HTML 标签的缺失或错误可能导致页面无法正…...

如何制作一份出色的公司介绍PPT?

制作一份公司介绍的PPT需要精心设计&#xff0c;以确保内容既专业又吸引人。以下是一个基本的框架和一些建议&#xff0c;帮助您创建一份有效的公司介绍PPT&#xff1a; PPT标题页 标题&#xff1a;公司全称&#xff08;可使用公司Logo作为背景或嵌入标题中&#xff09;副标题…...

Selenium 进行网页自动化操作的一个示例,绕过一些网站的自动化检测。python编程

这段代码是使用 Selenium 进行网页自动化操作的一个示例&#xff0c;主要目的是在加载网页时执行一些自定义的 JavaScript 代码&#xff0c;并等待页面上某个元素的出现。以下是代码的详细解释&#xff1a; ### 代码解释 #### 导入必要的模块 python from selenium.webdriver…...

HashMap和HashTable的区别

1、HashMap是线程不安全的&#xff0c;HashTable是线程安全的 HashMap&#xff1a;Fail-fast 机制。表示快速失败&#xff0c;在集合遍历过程中&#xff0c;一旦发现容器中的数据被修改了&#xff0c;会立刻抛出ConcurrentModificationException异常&#xff0c;从而导致遍历失…...

使用redis来进行调优有哪些方案?

Redis的调优方案可以从多个方面进行&#xff0c;以下是一些常见的优化方法及代码示例&#xff1a; 1.使用管道&#xff08;Pipelining&#xff09; 管道技术可以减少客户端与Redis之间的交互次数&#xff0c;从而提高性能。在批量操作时&#xff0c;通过管道可以一次性发送多个…...

macOS 中,默认的 Clang 编译器和 Homebrew 安装的 GCC 都不包含 bits/stdc++.h 文件

在 macOS 中&#xff0c;默认的 Clang 编译器和 Homebrew 安装的 GCC 都不包含 bits/stdc.h 文件&#xff0c;因为它是一个 非标准 的头文件&#xff0c;主要由 MinGW 和某些 Linux 平台的 GCC 提供。 解决方案 : 手动创建 bits/stdc.h 1. 创建文件夹和文件 在你的 GCC 标准…...

2012mfc,自绘列表控件

原文 使用常用控件版本4.70中的自定义绘画功能自定义列表控件的外观. 介绍 常见控件的4.70版引入了一项叫自定义绘画的功能. 可按轻量易用的自画版本对待自定义绘画.易用性来自,即只需处理一条消息(NM_CUSTOMDRAW),且你可让窗口为你干活,因此你不必完成物主绘画中的所有粗活…...

vue3运行时执行过程步骤

在 Vue 3 中&#xff0c;运行时的执行过程是一个复杂但高效的机制&#xff0c;主要包括初始化应用、渲染、响应式更新和销毁等阶段。以下是 Vue 3 运行时的执行过程的核心步骤和流程&#xff1a; 1. 应用初始化 1.1 创建 Vue 应用 调用 createApp 方法&#xff0c;创建一个 V…...

Python + LlamaIndex 构建本地知识库:打造企业级私有 RAG 系统

零 API 费用、数据完全本地、支持多种文档格式。本文带你从安装到实战,45 分钟搭建一个企业级本地知识库系统。 一、为什么要构建本地知识库? 对比维度 云端知识库(Notion AI / 飞书) 本地 RAG(LlamaIndex) 费用 按用户/容量付费,20-100/人/月 完全免费 数据隐私 数据上…...

git restore --source 提交id 和 git reset --hard 提交id 有什么区别

这两个命令长得像、都能“回到过去”&#xff0c;但核心逻辑、操作范围、安全性天差地别&#xff0c;一句话先点破&#xff1a; ✅ git restore --source 提交id&#xff1a;文件级操作&#xff0c;只恢复文件内容&#xff0c;不删提交历史、不改动分支&#xff0c;安全无风险 …...

OpenClaw 本地部署指南:把大模型揣进自己服务器,数据隐私全掌控

这篇文章写给想在自己服务器部署本地大模型助手&#xff0c;但又怕部署太复杂踩坑的开发者。我踩了各种坑整理出这套 step by step 教程&#xff0c;新手也能跟着一步步跑通。痛点场景用云服务商的大模型 API 有两个绕不开的问题&#xff1a;太贵了&#xff1a;调用量上去之后&…...

用 Shield CLI 本地开发调试:从零到上线你的第一个 Skill

当 AI Agent 需要调用外部能力时&#xff0c;Skill 就是它的"技能包"。本文以一个文旅素材搜索 Skill 为例&#xff0c;带你走完本地开发 → 调试 → 发布 → 安装使用的完整流程。核心工具只有一个 —— Shield CLI。 背景&#xff1a;什么是 Skill&#xff1f; Sk…...

Python 算法题必备基础操作(高频速查版)

这是刷算法题、笔试、面试最常用的 Python 基础操作合集&#xff0c;覆盖数组、字符串、链表、哈希、栈队列、排序、遍历、边界处理等核心场景&#xff0c;直接背会就能写代码。 一、输入输出&#xff08;笔试必用&#xff09; 1. 标准输入 # 单个整数 n int(input())# 一行多…...

OpenEMS:开源能源管理系统的架构解析与应用实践

OpenEMS&#xff1a;开源能源管理系统的架构解析与应用实践 【免费下载链接】openems OpenEMS - Open Source Energy Management System 项目地址: https://gitcode.com/gh_mirrors/op/openems 在可再生能源快速普及的今天&#xff0c;如何高效管理分布式能源系统成为技…...

C++“流星蝴蝶剑”动画的解析

C流星蝴蝶剑萍乡C创意编码精灵库案例这段视频展示了一个使用 C 编写的图形化演示程序&#xff0c;名为“C 流星蝴蝶剑”。视频主要分为三个部分&#xff1a;最终效果展示、生成“光剑”的代码解析、以及生成背景飞舞文字的代码框架解析。 以下是详细的视频与程序描述&#xff…...

2026年AI Agent客服问答助手知识难题破局

一、前言 许多企业上线的智能问答系统效果不佳&#xff0c;准确率不足70%&#xff0c;问题不在于技术不行&#xff0c;而在于用错了方法。当前系统普遍存在“知识看不懂、上下文记不住、回答靠碰运气”的问题&#xff0c;导致体验差、难落地。 2026年&#xff0c;真正有效的智能…...

终极指南:5分钟掌握Fan Control风扇控制软件,彻底优化电脑散热与噪音

终极指南&#xff1a;5分钟掌握Fan Control风扇控制软件&#xff0c;彻底优化电脑散热与噪音 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitco…...

FreakStudio缮

环境安装 pip install keystone-engine capstone unicorn 这3个工具用法极其简单&#xff0c;下面通过示例来演示其用法。 Keystone 示例 from keystone import * CODE b"INC ECX; ADD EDX, ECX" try: ks Ks(KS_ARCH_X86, KS_MODE_64) encoding, count ks.…...