尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

HOT100之二叉树翻转二叉树

HOT100之二叉树翻转二叉树
📅 发布时间:2026/7/11 1:35:44

翻转二叉树

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也好,本质上都是为了让每一个节点都执行一次交换

相关新闻

  • TDA7468与PIC18F26K40音频处理系统设计与实现
  • 微信同声传译插件 v0.3.4 实战:3步集成语音转文字,规避2个常见配置错误
  • OneNET API 安全鉴权 2022-05-01 版本:3种生成方法对比与微信小程序集成实战

最新新闻

  • 第 9 篇:状态机实践——状态环 + 步进表替代 if-else 地狱
  • STM32F405ZG与MCP3551高精度ADC信号采集实战
  • 所有人都在聊的GEO优化!全网最通俗拆解,看完才知道之前推广全白做
  • 【机器人路径规划】matlab遗传算法的机器人路径规划算法源码
  • Boehm GC 终结器机制解析:对象复活与最少2轮GC释放的3种场景
  • Python 数据质量监控:Schema 校验比代码 Review 更可靠

日新闻

  • OpenClaw本地部署:一键直连微信的私有化AI Agent实战指南
  • Kubernetes 系列【10】控制器:ReplicaSet(副本集)
  • 怎么寄快递才能便宜呢?2026年7月寄快递省钱攻略 - 生活情报姬

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号