镜像转换是将二叉树每个节点的left和right指针原地互换,不交换值也不重建树;需遍历所有非空节点,递归实现应先递归处理子树再交换指针,迭代实现用栈或队列对当前节点执行swap。

什么是镜像转换,它到底在改什么
镜像转换就是把二叉树每个节点的 left 和 right 指针互换——不是交换值,也不是重建树,而是原地翻转指针指向。只要递归或迭代地访问每个节点,执行一次 swap(node->left, node->right) 就完成了。关键点在于:必须访问到所有非空节点,且不能漏掉某一层的某个子树。
递归实现最直观,但要注意空指针和调用顺序
递归写法简洁,但容易错在两个地方:一是没判空直接解引用 root,二是左右子树交换顺序写反(其实不影响结果,但逻辑混乱)。正确做法是先递归处理左右子树,再交换当前节点的指针。
示例代码:
void mirrorTree(TreeNode* root) {
if (!root) return;
mirrorTree(root->left);
mirrorTree(root->right);
std::swap(root->left, root->right);
}- 必须检查
if (!root),否则访问root->left会崩溃 - 先递归再交换,确保子树已镜像,再把它们挂到当前节点两侧
- 用
std::swap比手动临时变量更安全,也更符合 C++ 习惯
迭代实现用栈或队列,核心是“每次只 swap 当前节点”
迭代避免了递归栈溢出风险,适合深度极大的树。关键是:无论用 stack 还是 queue,都只负责遍历,真正的镜像动作始终是针对当前弹出/取出的节点做 swap。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
用栈(DFS)示例:
void mirrorTree(TreeNode* root) {
if (!root) return;
std::stack<TreeNode*> stk;
stk.push(root);
while (!stk.empty()) {
TreeNode* node = stk.top(); stk.pop();
std::swap(node->left, node->right);
if (node->left) stk.push(node->left);
if (node->right) stk.push(node->right);
}
}- 入栈顺序不影响镜像结果,但影响遍历路径(左先还是右先)
- 必须在
swap后再 push 子节点,否则 swap 前子节点还没被处理 - 如果用
queue,就是 BFS 镜像,逻辑一样,只是容器换掉
测试时最容易漏掉的边界情况
镜像函数看似简单,但实测常栽在这些地方:
-
root为nullptr—— 函数必须能安全返回,不崩溃 - 只有根节点(
root非空,但left和right都为nullptr)—— 此时 swap 无副作用,应正常结束 - 单边树(如全左链)—— 镜像后应变成全右链,需人工验证指针走向
- 修改后原树是否还能正常遍历(比如中序遍历结果是否变为原树的“逆中序”)—— 这是验证镜像是否成功的有效方式
真正麻烦的不是写法,而是确认你操作的是原始指针,没意外创建副本;一旦用了智能指针或浅拷贝,镜像就失效了。

















