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

力扣 hot100 Day47

114. 二叉树展开为链表

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

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。

展开后的单链表应该与二叉树 先序遍历 顺序相同。

//抄的
class Solution {
public:void flatten(TreeNode* root) {TreeNode* dummy = new TreeNode();TreeNode* prev = dummy;stack<TreeNode*> st;if (root) st.push(root);while (!st.empty()) {TreeNode* curr = st.top();st.pop();if (curr->right) st.push(curr->right);if (curr->left) st.push(curr->left);prev->right = curr;prev = curr;curr->left = nullptr;}delete dummy;}
};

我自己尝试的做法是,递归调用,想按着先序遍历做,但由于中途会变更根节点,导致回溯时会出现问题,很难解决。

上面的代码中,通过栈来存放先前的节点信息,具体逻辑如下

  1. 将右子节点压栈,再将左子节点压栈(这样左子节点会先出栈)

  2. 每次处理当前节点时,将其连接到前一个节点的右侧

  3. 最后清空左指针

//抄的
class Solution {
public:void flatten(TreeNode* root) {if (!root) return;// 展平左右子树flatten(root->left);flatten(root->right);// 保存原始右子树TreeNode* right = root->right;// 将左子树移到右边root->right = root->left;root->left = nullptr;// 找到当前右子树的最末端TreeNode* curr = root;while (curr->right) {curr = curr->right;}// 将原始右子树接到末端curr->right = right;}
};

递归也是能做的,但需要按后序遍历顺序进行,具体逻辑如下

  1. 先递归展平左右子树

  2. 然后将左子树移到右边

  3. 最后将原始右子树接到新右子树的末端

http://www.lryc.cn/news/591681.html

相关文章:

  • 网络安全威胁下的企业困境与破局技术实践
  • Linux内核内存管理相关的配置参数
  • 电商行业如何做好网络安全工作?
  • 【web安全】DVWA反射型XSS漏洞分析与利用
  • RGBA图片格式转换为RGB格式(解决convert转换的失真问题)
  • 利用node.js在本地搭建简易http服务器
  • 快慢指针的应用
  • RCU机制及常见锁的理解
  • web安全入门 | 记新手小白初次尝试挖越权漏洞
  • Ansible AWX 自动化运维
  • 3t车用手动卧式千斤顶设计含8张CAD图纸PDF图
  • parallels desktop windows win10无法复制文件无法共享剪切板
  • [NIPST AI]对抗性机器学习攻击和缓解的分类和术语
  • RocketMq集群高可用
  • Java并发编程第三篇(深入解析Synchronized)
  • 系统引导修复(2)
  • 《Java语言程序设计》1.2.5 复习题
  • Spring Boot 分层架构详解:Controller、Service、Mapper...
  • SLG 游戏如何进行防破解和防盗版保护?
  • 《迭代器 VS 生成器:Python 惰性计算的两种实现方案详解》
  • Scrapy无缝集成Pyppeteer:异步无头浏览器爬虫架构实战
  • 中科固源深度解析:DoIP 协议原理、应用与安全防护全流程
  • cnpm命令报internal/modules/cjs/loader.js:797 throw err; ^ Error: Cannot find
  • 第12章 存储类、链接和内存管理
  • python学智能算法(二十二)|SVM-点与超平面的距离
  • Adam优化器
  • 深入理解 KVM 子系统:从虚拟化核心到内核实现的全景解析
  • js对象简介、内置对象
  • 【中等】题解力扣21:合并两个有序链表
  • mysql——搭建MGR集群