二叉树镜像是将每个节点的左子树与右子树递归互换的操作;需用std::swap安全交换指针,递归终止于空节点,迭代法需先交换再压栈非空子节点,且须返回原根节点。

什么是二叉树镜像?
二叉树镜像就是把每个节点的左子树和右子树互换,递归地翻转整棵树。这不是简单地交换根节点左右指针,而是要深入到每个非空子树做同样操作。常见错误是只翻转了顶层,或者在交换时用了临时变量但没正确处理空指针导致崩溃。
用 std::swap 递归翻转最简洁
标准库的 std::swap 能安全处理空指针(nullptr),比手写三步交换更可靠。递归终止条件必须是遇到空节点,否则会无限调用或访问非法内存。
示例实现:
void mirror(TreeNode* root) {
if (!root) return;
std::swap(root->left, root->right);
mirror(root->left);
mirror(root->right);
}
- 必须先交换再递归,否则递归调用的是原方向的子树
- 如果用 C++17 及以上,
std::swap对原始指针是特化过的,无额外开销 - 不要写成
root->left = root->right; root->right = root->left;—— 这会导致右子树被覆盖后丢失
迭代写法要注意栈中保存的是节点指针,不是子树结构
用栈模拟递归时,每次弹出一个节点,交换它的左右子树,再把非空子节点压栈。容易出错的是:压栈顺序不影响结果,但若漏判 nullptr,会把空指针压入栈,后续解引用直接崩溃。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
关键代码片段:
stack<treenode> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top(); s.pop();
if (!node) continue;
std::swap(node->left, node->right);
if (node->left) s.push(node->left);
if (node->right) s.push(node->right);
}</treenode>
- 必须在
std::swap后再检查子节点是否为空,否则交换前就压栈,逻辑错乱 - 不能用
queue替代stack来“层序镜像”——镜像本身不依赖遍历顺序,但用队列容易误以为是 BFS 翻转,其实只要每层都交换左右,结果一样;不过栈更贴近递归直觉
LeetCode 验证时别忘了返回原树根节点
有些题目(如 LeetCode 226)要求函数返回 TreeNode*,而不仅是 void。此时不能只翻转还返回 nullptr,得确保输入非空时返回原 root。镜像操作是原地修改,不需要新建节点,所以返回值只是形式上的“链表头”。
- 如果函数签名是
TreeNode* invertTree(TreeNode* root),末尾必须写return root; - 测试用例含空树(
root == nullptr),要第一时间返回,否则后续操作非法 - 本地调试时可用
printTree辅助验证,但注意镜像后中序遍历不再有序——这是正常现象,别误判为翻转失败
实际写的时候,最容易被忽略的是递归基的判断位置和 std::swap 的适用边界——它不适用于智能指针混用场景,比如 std::unique_ptr<treenode></treenode>,这时得用移动语义或手动赋值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










