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

力扣 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.xdnf.cn/news/15581.html

相关文章:

  • H3CNE 综合实验二解析与实施指南
  • S7-1200 模拟量模块全解析:从接线到量程计算
  • 如何清除 npm 缓存
  • 一台显示器上如何快速切换两台电脑主机?
  • LAMP迁移LNMP Nginx多站点配置全流程
  • 进程终止机制详解:退出场景、退出码与退出方式全解析
  • Transformer从入门到精通
  • 文件夹颜色更改工具 FolderIco 8.1
  • 面试高频题 力扣 200.岛屿数量 洪水灌溉 深度优先遍历 暴力搜索 C++解题思路 每日一题
  • 网络原理 —— HTTP
  • cve-2012-0809 sudo格式化字符串漏洞分析及利用
  • ubuntu 22.04 pam 模块设置用户登录失败锁定
  • python识别整数、浮点数、特殊符号,最简单的方式
  • Pytorch深度学习框架实战教程02:开发环境部署
  • 记录Leetcode中的报错问题
  • 宝塔面板一键迁移(外网服务器迁移到内网服务器)
  • 中兴B860AV5.1-M2_S905L3SB最新完美版线刷包 解决指示灯异常问题
  • HTTP 状态码笔记
  • 搭建Java环境
  • stack,queue,priority_queue的模拟实现及常用接口
  • 【原创】【图像算法】高精密电子仪器组装异常检测
  • 可获得的最大点数
  • AI搜索+GEO时代的营销策略更迭学习笔记
  • DIDCTF-陇剑杯
  • 在Anaconda Prompt中安装库【保姆教程】
  • 网络编程7.17
  • 线程(三) linux 同步
  • TASK01【datawhale组队学习】地瓜机器人具身智能概述
  • Leetcode 494. 目标和
  • [spring6: @EventListener @TransactionalEventListener ]-源码分析