简单LeetCode 226动画补充中引导学习
翻转二叉树
递归:交换左右子树
对每个节点交换它的左右孩子,然后递归翻转两棵子树——先交换再递归(先递归再交换也对)。
时间复杂度 O(n)空间复杂度 O(h)(递归栈,h 为树高)
题单:面试热题
题目描述
给定一棵二叉树的根节点,把它翻转(交换每个节点的左右子树)后返回根节点。
学习目标
能说清翻转二叉树为什么可以分解成"交换当前节点 + 递归翻转左右子树",并写对递归终止条件。
已完成 0 / 6 阶段
诊断
先问:整棵树翻转,每个节点要做什么
翻转整棵树,根节点的左右子树会发生什么?只交换根节点的左右孩子,整棵树就翻好了吗?
建议先完成当前阶段(提示 / 检查 / 自评),再进入下一步;也可以直接跳过。
解题思路
核心思想
对每个节点交换它的左右孩子,然后递归翻转两棵子树——先交换再递归(先递归再交换也对)。
为什么需要它
树的翻转是"自我相似"的:翻转整棵树 = 交换左右子树 + 各自翻转内部的子树,递归定义直接对应递归代码。
第一反应:直觉方案
层序遍历每一层,把节点按镜像顺序重新连——能做,但"哪一层怎么翻"很快就把人绕晕。
关键洞察
关键洞察是不要试图在脑子里展开整棵树:只做"当前节点该做的事"(交换左右孩子),剩下的交给递归——这就是所有树类题目的通用思维("前序做事、子问题递归")。递归的终止条件也自带:空节点直接返回。
时间复杂度 O(n)空间复杂度 O(h)(递归栈,h 为树高)
易错点
- 交换和递归的顺序要一致:先交换,则递归处理的是"交换后的"左右子树
- 空节点是递归的终止条件,必须先判断
- 这题交换值和交换指针都行,但交换指针的写法更通用(有些题节点值带额外信息)
参考代码
参考代码
1function invertTree(root) {
2 if (!root) return null;
3 [root.left, root.right] = [root.right, root.left];
4 invertTree(root.left);
5 invertTree(root.right);
6 return root;
7}
逐步演示
这道题目前是索引版:题面、解题思路与双语言代码已是完整内容; 逐步动画会按计划补充。