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

LeetCode HOT100 - 二叉树展开为链表

首先,因为是树,所以肯定是自顶向下的

接着,因为本质还是做前序遍历,所以肯定还是要 dfs

核心就是每次左子树的尾节点要接到右子树的根节点,并且把该节点的左子树置空,右节点接到原来的左子树的根节点上

然后传回这条链的末尾节点

所以逻辑上做些处理

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void flatten(TreeNode* root) {auto dfs = [&](this auto&& self, TreeNode* u) -> TreeNode* {if (!u) {return u;}if ((!u->left) && (!u->right)) {return u;}auto x = self(u->left);auto y = self(u->right);if (x && u->right) x->right = u->right;if (u->left) u->right = u->left;u->left = nullptr;if (y) {return y;}return x;};dfs(root);}
};

不过这样做的话空间复杂度大致是 O(h),如果要做到严格 O(1) 的话还是要做些优化和思路上的调整

一般就是要迭代原地调整指针

这里就直接先放代码了

class Solution {
public:void flatten(TreeNode* root) {TreeNode* cur = root;while (cur) {if (cur->left) {TreeNode* pre = cur->left;while (pre->right) {pre = pre->right;}pre->right = cur->right;cur->right = cur->left;cur->left = nullptr;}cur = cur->right;}}
};

核心就是
如果当前节点有左子树:

  1. 找到左子树最右边的节点 pre
  2. 把当前节点原来的右子树接到 pre->right
  3. 把左子树整体挪到 cur->right
  4. cur->left 置空

相当于不是一次处理完左子树,是每次整理当前左子树最右侧的那条链,然后一次次操作,通过把局部结构改成前序链表形式,最终得到 root -> left subtree -> right subtree

http://www.jsqmd.com/news/721292/

相关文章:

  • 4月30日多因子共振节点:鲍威尔“收官效应”与权力结构重塑的预期重构
  • 3步实现视频流畅度飞跃:Flowframes AI插帧实战指南
  • Geatpy旅行商问题(TSP)求解:编码策略与优化技巧
  • NowinAndroid插件化模块设计终极指南:从零到一构建现代化Android应用架构
  • Netflix克隆项目测试策略:Jest与React Testing Library最佳实践
  • 黄金首饰价格查询系统源码_已对接数据接口 贵金属价格查询API源码
  • 【自用】OpenCode基本使用以及使用过程中遇到的问题
  • lvgl基础
  • python basedpyright
  • 别再只会addItem了!PyQt5 QComboBox的增删改查与事件绑定保姆级教程
  • AI降本工具哪个好?多平台需求选嘎嘎降AI一份订单管9平台! - 我要发一区
  • 深度解析RePKG:Wallpaper Engine资源解包与纹理转换技术实现
  • EasyAnimateV5-7b-zh-InP实现Web端视频编辑器:前端技术解析
  • AI降本工具哪个好?率零维普万方专精+95.7%降到3.7%实测揭秘! - 我要发一区
  • FilePizza终极指南:如何在浏览器中实现真正的P2P文件传输
  • 别只盯着目录!理工科论文写作前,先把这70%的图表搞定(附Visio/Origin技巧)
  • 从Llama 2到GPT-4:聊聊MHA、MQA、GQA这些注意力机制到底该怎么选?
  • Windows+CUDA 12.2+Anaconda环境:手把手教你从创建虚拟环境到成功验证PyTorch安装
  • electron-vue-music API集成方案:网易云音乐接口的完整封装与调用
  • 20243410 实验三《Python程序设计》实验报告
  • JEngine实战教程:从零开始构建可热更新的Unity游戏
  • 20260429 紫题训练
  • Win旧版或win10部分版本如何解除260字符长路径名限制?
  • 上饶GEO优化公司专业度排行 本土服务商实测对比 - 奔跑123
  • 终极Android倒计时方案对比:CountdownView与自定义CountDownTimer如何选择?
  • 如何快速掌握Quivr样式系统:从设计令牌到主题实现的完整指南
  • 如何用 Dask 替代 Pandas 进行高效 Excel 数据处理
  • 2026年3月有名的轻骨料混凝土生产厂家哪家便宜,LC5.0轻集料混凝土,轻骨料混凝土公司哪家便宜 - 品牌推荐师
  • 14.json数据格式认识
  • HyprPanel天气与时钟模块:多时区支持与实时气象数据集成