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

二叉树展开为链表C++

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

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

迭代法,创建了一个哨兵节点(先序遍历),用了栈,空间复杂度为O(n)

class Solution {
public:void flatten(TreeNode* root) {if(root==nullptr) return;TreeNode* dummy = new TreeNode();stack<TreeNode*> st;st.push(root);while(!st.empty()){TreeNode* node = st.top();st.pop();// 栈先进后出,所以左子节点先出栈if(node->right) st.push(node->right);if(node->left) st.push(node->left);// 清空当前节点的左右子节点node->left = nullptr;node->right = nullptr;// 将当前节点加入新的链表dummy->right = node;dummy = node;}}
};

迭代法,原地创建,没有创建新节点,并且空间复杂度为O(1)

class Solution {
public:void flatten(TreeNode* root) {if(root==nullptr) return ;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. 找到左子树的最右节点(前驱节点)
  2. 将当前节点的右子树接到前驱节点的右边
  3. 将左子树移到右边,并置空左指针
    1/ \2   5/ \   \
3   4   6
  • 当前节点 1,左子树存在
    – 找到左子树最右节点 (4)
    – 将 1 的右子树 (5->6) 接到 4 的右边
    – 将左子树移到右边
    1\2/ \3  4  \5\6

以此类推

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

相关文章:

  • 20.数据同步Mysql-ES解决方案
  • 网络编程学习路线图
  • 如何配置core dump生成
  • Android App冷启动流程详解
  • webrtc-streamer视频流播放(rstp协议h264笔记)
  • 新人如何入门学习 STM32?
  • Stata如何做机器学习?——SHAP解释框架下的足球运动员价值驱动因素识别:基于H2O集成学习模型
  • Selenium 自动化测试中跳过机器人验证的完整指南:能用
  • 1688 Agent Russia 丨俄罗斯淘宝代购1688代采集运系统搭建指南介绍
  • 8分钟讲完 Tomcat架构及工作原理
  • Vue如何处理数据、v-HTML的使用及总结
  • 使用Python Watchdog库实现文件系统监控
  • Linux基本命令篇 —— tar命令
  • 修改阿里云vps为自定义用户登录
  • 使用Feapder中的Dedup过滤数据
  • 【python】json.loads()函数处理字符串时不需要指定编码
  • Windows系统编程(Win32 API)
  • pytorch、torchvision与python版本对应关系
  • 什么是软中断
  • 使用Visual Studio 2022创建CUDA编程项目
  • Python爬虫 XPath 三方库lxml
  • Unity Android与iOS自动重启
  • Java综合练习04
  • js代码中的作用域
  • 深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹
  • Mausezahn - 网络流量生成与测试工具(支持从链路层到应用层的协议模拟)
  • C++ 解决类相互引用导致的编译错误
  • 状态码301和302的区别
  • 智能设备远程管理:基于OpenAI风格API的自动化实践
  • 渗透靶机 Doctor 复盘