226. 翻转二叉树(简单)

Blind 75 › 226. 翻转二叉树(简单) (第 1 章)
文章工具

题目

给一棵二叉树的根节点 root,把这棵树整体镜像:每个节点的左孩子变右孩子、右孩子变左孩子,最后返回翻转后的根节点。

自造示例:层序数组 [1,2,3,4,5,6,7] → [1,3,2,7,6,5,4];空树 [] → []。

约束:节点数 0 ~ 100;节点值范围 -100 ~ 100。

思路

一句话:对每个节点交换左右孩子,再对左右子树分别做同样的事。

先想最直白的:另建一棵新树,遍历原树时把「原右子树挂到新左、原左子树挂到新右」。这样也能翻,但要额外申请一整棵树的节点、维护新旧两边的指针,代码啰嗦且多花 O(n) 空间——而题目允许原地修改,没必要造新节点。

关键观察:整棵树的翻转不是一个大动作,而是每个局部翻转的组合。把根节点的左右孩子交换,问题就拆成「翻转原来的右子树(现在在左边)」和「翻转原来的左子树(现在在右边)」两个完全同构的小问题。

于是递归定义自然出来:

  • 空节点:什么都不做,返回空。
  • 非空节点:交换左右孩子 → 递归翻转左子树 → 递归翻转右子树 → 返回当前节点。

先交换再递归就是前序;先递归后交换就是后序,两者都成立。选前序,代码最直观。

下面用示例跟踪局部交换:

节点原左 / 原右翻转后左 / 右
12 / 33 / 2
24 / 55 / 4
36 / 77 / 6

每个节点都把自己的两个孩子换位,拼起来就是整棵树的镜像。

解法

递归骨架只有三步:判空、交换、递归。交换用一条语句完成,C++ 可用 swap,Python 用元组同时赋值。

下图把上面 3 个步骤串成流程,并逐步演示:

226. 翻转二叉树(简单) 解法步骤流程图
图① 解法步骤流程图(共 3 步)。
226. 翻转二叉树(简单) 按步骤逐步执行的动画
动图② 按步骤依次推进(循环播放)。

C++

C++ 片段需补全 main() 函数才能运行在实训台打开 →
class Solution {
public:
 TreeNode* invertTree(TreeNode* root) {
 if (root == nullptr) {
 return nullptr;          // 递归出口:空树仍为空
 }
 swap(root->left, root->right);   // 先交换当前节点的左右孩子
 invertTree(root->left)

🔒

本篇为付费内容

您已阅读试读部分,购买后即可解锁全文。

⚠️ 本站内容已做唯一性标记并受版权保护,未经授权禁止转载,侵权必究。