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

HOT100之二叉树翻转二叉树

翻转二叉树

struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x = 0, TreeNode* l = nullptr, TreeNode* r = nullptr) : val(x), left(l), right(r) {} };

这道题其实不难,遍历的部分前面已经说过了,DFS、BFS都可以,所以这道题真正需要想的是:
对于一个节点来说,翻转到底翻转了什么?
仔细看节点定义

TreeNode* left; TreeNode* right;

一个节点里面存了两个指针,分别指向它的左右子树,所以翻转一颗最小二叉树,其实不是交换节点值,而是交换两个指针的指向

swap(root->left, root->right);

欸?这样就结束了吗?
对当前节点来说,确实结束了
但是对整颗树来说,还没有结束,因为当前节点下面的左右子树内部还没有翻转
所以还是那句话:

*每一个节点都当作基于该节点为根节点的一颗独立子树

当前节点要做的事情是:

swap(root->left, root->right);

所以通用到整颗树上就是,遍历加交换


DFS递归法

递归的部分不用重新想复杂了,我们只需要确定两件事:

  1. 当前节点要做什么
  2. 什么时候停止
    当前节点要做的事情:
swap(root->left, root->right);

停止条件:

if(root == nullptr) return nullptr;

因为当节点为空的时候,说明已经越过叶子节点了,这条路走完,直接返回
于是我们先处理当前节点,再继续处理左右子树

TreeNode* invertTree(TreeNode* root) { if(root == nullptr) return nullptr; swap(root->left, root->right); invertTree(root->left); invertTree(root->right); return root; }

这里有一个容易绕的地方:
我们交换之后再递归,root->left不就是原来的右子树了吗?
是的,但这并不影响
因为我们并不关心它原来在左边还是右边,我们只需要保证当前节点下面的两颗子树都继续翻转即可
当然,也可以先翻转左右子树,最后再交换当前节点

TreeNode* invertTree(TreeNode* root) { if(root == nullptr) return nullptr; invertTree(root->left); invertTree(root->right); swap(root->left, root->right); return root; }

这两种都可以,因为这道题最终只要求每一个节点都交换一次左右子树
不过中序遍历就不要硬套了,因为中间一交换,左右子树的位置发生变化,很容易把同一棵子树处理两次


BFS迭代法

BFS也一样,层序遍历只是负责把每一个节点都拿出来
拿出来之后干什么?
交换它的左右子树

TreeNode* invertTree(TreeNode* root) { if(root == nullptr) return nullptr; queue<TreeNode*> q; q.push(root); while(!q.empty()) { TreeNode* node = q.front(); q.pop(); swap(node->left, node->right); if(node->left) q.push(node->left); if(node->right) q.push(node->right); } return root; }

这里先交换再入队也可以
因为交换只是改变左右位置,并不会让节点消失,左右子树依然都挂在当前节点下面


总结

这道题不要把重点放在“怎么重新连接整颗树”上
二叉树节点本来就用两个指针保存左右子树,所以翻转当前节点只需要:

swap(root->left, root->right);

剩下的事情就是遍历整颗树
DFS也好,BFS也好,本质上都是为了让每一个节点都执行一次交换

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

相关文章:

  • 微信同声传译插件 v0.3.4 实战:3步集成语音转文字,规避2个常见配置错误
  • Unity初学者入门指南:从零到一构建可交互3D应用
  • OneNET API 安全鉴权 2022-05-01 版本:3种生成方法对比与微信小程序集成实战
  • STM32上拉下拉电阻配置与信号完整性设计
  • 如何高效使用BiliDownloader:新手快速上手指南
  • TDA7468与PIC18F26K40音频处理系统设计与实现
  • 嵌入式机器学习 - 学习笔记1.2.1 - 嵌入式设备上的机器学习
  • 2026年珠海电脑维修避坑指南:从黑屏蓝屏到数据恢复5家靠谱推荐 - 本地品牌推荐
  • 豆包视频去水印:HLS分片解密与本地FFmpeg无损处理方案
  • RIPEMD-160 哈希算法:从 MD4 到比特币地址的 160 位安全演进
  • Suno AI音乐创作指南:从国歌改编到原创爱国旋律实战
  • 电脑主机能正常启动,但显示器黑屏显示无信号的解决方法
  • 工业负载控制:TPD2017FN MOSFET与PIC18F47Q10方案解析
  • 从OpenAI实习生模式看AI工程化:ChatGPT团队架构与开发实践
  • DID 与 DDD 模型对比:基于 SO2 排放政策数据的 3 项估计结果差异分析
  • 协议之DASH介绍
  • 二阶线性递推数列通项:Python 3.12 实现特征根法,3步求解与可视化
  • 最新AI量化开发,学习表达开发验证要分阶段
  • 2026年7月台州靠谱GEO/SEO优化公司实测推荐榜单 - 品牌测评网
  • 智能家居Wi-Fi连接:2.4GHz与5GHz频段5大关键差异与设备分配策略
  • 将 PyTorch 训练出的 PySlowFast(.pyth)模型转换为 ONNX 格式
  • ROS 2 Humble vs Noetic:树莓派4B性能实测与5个关键选型建议
  • 系统规划与管理师-数据标准化与数据管理(占 6-8 分)
  • 数字电路信号上下拉配置原理与工程实践
  • Linux 账户安全校验:pwck 命令详解,一键检测 passwd 与 shadow 完整性
  • 大模型推理服务的延迟优化与成本控制策略
  • 【面试算法笔记】0101-数组-二分查找 相关
  • NTN全局控制器集中管理的优势
  • 2026年宁波刑事律师推荐怎么选?看这三点关键不踩雷 - 本地品牌推荐
  • FL Studio Producer Edition 26.1.0 Build 5530 全插件版新功能介绍