C++如何实现简单的二叉树镜像反转_C++递归与迭代两种方案【练习】

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

C++如何实现简单的二叉树镜像反转_C++递归与迭代两种方案【练习】

什么是二叉树镜像反转?

镜像反转就是把每个节点的左右子树互换,最终整棵树看起来像照镜子一样。不是翻转值,而是翻转结构——root->leftroot->right 指针要交换,且该操作需递归作用于所有子树。

递归方案:简洁但要注意空指针

递归是最直观的写法,核心是「先换当前节点的左右,再递归处理左右子树」。关键点在于必须在交换前保存原始指针,否则会丢失引用。

常见错误是写成:

root->left = mirrorTree(root->right); root->right = mirrorTree(root->left);  // 错!此时 left 已被覆盖

正确做法:

立即学习C++免费学习笔记(深入)”;

  • 检查 root 是否为 nullptr,是则直接返回
  • 先递归处理左右子树,得到镜像后的子树根指针
  • 再交换 root->leftroot->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 或调试器确认指针关系是否真被翻转——光看输出值不够,结构才是关键。