二叉树镜像反转是将每个节点的左右子树指针互换,递归或迭代实现;递归需先保存原指针再交换,迭代用栈逐节点处理并压入非空子节点。

什么是二叉树镜像反转?
镜像反转就是把每个节点的左右子树互换,最终整棵树看起来像照镜子一样。不是翻转值,而是翻转结构——root->left 和 root->right 指针要交换,且该操作需递归作用于所有子树。
递归方案:简洁但要注意空指针
递归是最直观的写法,核心是「先换当前节点的左右,再递归处理左右子树」。关键点在于必须在交换前保存原始指针,否则会丢失引用。
常见错误是写成:
root->left = mirrorTree(root->right); root->right = mirrorTree(root->left); // 错!此时 left 已被覆盖
正确做法:
立即学习“C++免费学习笔记(深入)”;
- 检查
root是否为nullptr,是则直接返回 - 先递归处理左右子树,得到镜像后的子树根指针
- 再交换
root->left和root->right的指向
示例(原地修改):
TreeNode* mirrorTree(TreeNode* root) {
if (!root) return nullptr;
TreeNode* left = mirrorTree(root->left);
TreeNode* right = mirrorTree(root->right);
root->left = right;
root->right = left;
return root;
}迭代方案:用栈模拟递归,避免栈溢出风险
迭代本质是手动维护调用栈,适合深度极大的树(防止递归爆栈)。每次从栈中弹出一个节点,交换其左右子节点,再把非空子节点压入栈——注意:左右都要压,顺序不重要,因为只是结构交换。
容易踩的坑:
- 只压一个子节点(漏掉另一边),导致部分子树没被处理
- 交换前未判空,对
nullptr做->left解引用 → 段错误 - 用队列 BFS 也能做,但逻辑更绕;栈 DFS 更贴近递归语义,推荐栈
示例(栈实现):
TreeNode* mirrorTree(TreeNode* root) {
if (!root) return nullptr;
stack<TreeNode*> stk;
stk.push(root);
while (!stk.empty()) {
TreeNode* node = stk.top(); stk.pop();
swap(node->left, node->right);
if (node->left) stk.push(node->left);
if (node->right) stk.push(node->right);
}
return root;
}测试时最容易忽略的边界:空树、单节点、只有左/右子树
很多实现能过样例但挂在线上评测,往往是因为没覆盖这些情况。比如:
-
mirrorTree(nullptr)必须安全返回nullptr - 单节点树(
root无子节点)交换后仍是它自己,不能崩溃或改错指针 - 只有左子树时,交换后
root->right应指向原左子树,root->left变为nullptr
建议手写三行测试用例,分别构造这三种结构,用 printf 或调试器确认指针关系是否真被翻转——光看输出值不够,结构才是关键。










