题目来源:LeetCode226:翻转二叉树
问题抽象:设计算法将二叉树原地翻转(镜像反转每个节点的左右子树),需满足以下核心需求:
-
翻转规则:
- 对每个非叶节点,交换其左右子树(递归至叶子节点终止);
- 翻转后树的结构满足:原左子树变为右子树,原右子树变为左子树。
-
实现约束:
- 原地修改:直接修改节点指针指向,禁止创建新树;
- 时间复杂度 O(n)(需访问所有节点,
n为节点数); - 空间复杂度 O(h)(递归栈深度,
h为树高,最坏O(n))。
-
核心操作:
- 递归交换(DFS):
- 递归翻转左子树 → 递归翻转右子树 → 交换当前节点的左右指针;
- 迭代实现(BFS):
- 层序遍历,每访问一个节点立即交换其左右子树。
- 递归交换(DFS):
-
边界处理:
- 空树直接返回
null; - 单节点树无需操作(无子树可交换);
- 叶子节点:递归终止(无子节点)。
- 空树直接返回
输入:二叉树根节点 root(节点数 n ∈ [0,100])
输出:翻转后的二叉树根节点(同输入根节点)
解题思路
要翻转二叉树,本质是交换每个节点的左右子树。核心思路如下:
-
递归法:
- 从根节点开始,递归地交换每个节点的左右子树。
- 先交换当前节点的左右子树,再递归处理左子树和右子树(此时左右子树已交换)。
- 时间复杂度:O(n),每个节点访问一次。
- 空间复杂度:O(h),其中 h 为树的高度,递归栈深度。
-
迭代法(广度优先):
- 使用队列辅助层序遍历。
- 每次从队列取出节点,交换其左右子树,再将非空的子节点入队。
- 时间复杂度:O(n),每个节点访问一次。
- 空间复杂度:O(w),其中 w 为树的最大宽度(队列存储)。
亮点:
- 递归法代码简洁,在树较平衡时空间更优(O(log n))。
- 迭代法避免递归开销,但队列空间可能较大(最坏 O(n))。
- 由于树节点数 ≤100,递归法更简洁高效,选用递归法。
代码实现(Java版)🔥点击下载源码
class Solution {
public TreeNode invertTree(TreeNode root) {
// 递归终止条件:当前节点为空时直接返回
if (root == null) {
return null;
}
// 交换当前节点的左右子树
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
// 递归翻转左右子树
invertTree(root.left);
invertTree(root.right);
return root;
}
}
代码说明
- 递归终止条件:若当前节点为
null,直接返回(处理空树或叶子节点)。 - 交换子树:使用临时变量
temp交换当前节点的左右子树。 - 递归调用:对交换后的左右子树递归执行翻转操作。
- 返回根节点:最终返回翻转后的根节点。
提交详情(执行用时、内存消耗)

1840

被折叠的 条评论
为什么被折叠?



