一、题目描述给你一个二叉树的根节点root判断它是否是轴对称的。示例 11 / \ 2 2 / \ / \ 3 4 4 3输出true示例 21 / \ 2 2 \ \ 3 3输出false 二、核心思路这题的本质很多人一上来会想“是不是判断左子树对称 右子树对称”❌这是错误思路✅ 正确思路是判断左子树 和 右子树 是否互为镜像 什么是“镜像”如果两棵树满足根节点值相同左树的左 右树的右左树的右 右树的左那么它们就是镜像。 一句话总结对称二叉树 左右子树镜像交叉比较 三、递归解法推荐✅ 思路拆解我们定义函数isMirror(left, right)表示判断两棵树是否镜像。 递归终止条件1. 都为空 → 对称 2. 一个为空 → 不对称 3. 值不同 → 不对称 递归逻辑核心left-left vs right-right left-right vs right-left 完整代码C语言#include stdbool.h bool isMirror(struct TreeNode* left, struct TreeNode* right) { if (left NULL right NULL) return true; if (left NULL || right NULL) return false; if (left-val ! right-val) return false; return isMirror(left-left, right-right) isMirror(left-right, right-left); } bool isSymmetric(struct TreeNode* root) { if (root NULL) return true; return isMirror(root-left, root-right); } 四、迭代解法进阶加分如果面试官问你“不用递归可以吗”你就可以用**队列BFS**解决 ✅ 思路每次成对取节点比较左节点 vs 右节点然后按镜像顺序入队 代码实现#include stdbool.h #include stdlib.h bool isSymmetric(struct TreeNode* root) { if (!root) return true; struct TreeNode* queue[2000]; int front 0, rear 0; queue[rear] root-left; queue[rear] root-right; while (front rear) { struct TreeNode* left queue[front]; struct TreeNode* right queue[front]; if (!left !right) continue; if (!left || !right) return false; if (left-val ! right-val) return false; queue[rear] left-left; queue[rear] right-right; queue[rear] left-right; queue[rear] right-left; } return true; }⚠️ 五、常见错误总结面试高频坑❌ 错误 1写成“同方向比较”isMirror(left-left, right-left) // ❌ 错 这是判断“相同”不是“镜像”❌ 错误 2只写一个参数递归dfs(root) 无法表达“两棵树比较”❌ 错误 3漏掉空节点判断 很容易 SEGFAULT 六、复杂度分析方法时间复杂度空间复杂度递归O(n)O(h)迭代O(n)O(n) 七、面试一句话总结这题的核心是把“对称”转化为“镜像比较”使用递归函数同时遍历左右子树并进行交叉判断。✅ 八、推荐记忆模板必背return check(l-left, r-right) check(l-right, r-left);
[特殊字符] LeetCode 101. 对称二叉树(C语言)——递归 + 迭代详解(高质量图解思路)
一、题目描述给你一个二叉树的根节点root判断它是否是轴对称的。示例 11 / \ 2 2 / \ / \ 3 4 4 3输出true示例 21 / \ 2 2 \ \ 3 3输出false 二、核心思路这题的本质很多人一上来会想“是不是判断左子树对称 右子树对称”❌这是错误思路✅ 正确思路是判断左子树 和 右子树 是否互为镜像 什么是“镜像”如果两棵树满足根节点值相同左树的左 右树的右左树的右 右树的左那么它们就是镜像。 一句话总结对称二叉树 左右子树镜像交叉比较 三、递归解法推荐✅ 思路拆解我们定义函数isMirror(left, right)表示判断两棵树是否镜像。 递归终止条件1. 都为空 → 对称 2. 一个为空 → 不对称 3. 值不同 → 不对称 递归逻辑核心left-left vs right-right left-right vs right-left 完整代码C语言#include stdbool.h bool isMirror(struct TreeNode* left, struct TreeNode* right) { if (left NULL right NULL) return true; if (left NULL || right NULL) return false; if (left-val ! right-val) return false; return isMirror(left-left, right-right) isMirror(left-right, right-left); } bool isSymmetric(struct TreeNode* root) { if (root NULL) return true; return isMirror(root-left, root-right); } 四、迭代解法进阶加分如果面试官问你“不用递归可以吗”你就可以用**队列BFS**解决 ✅ 思路每次成对取节点比较左节点 vs 右节点然后按镜像顺序入队 代码实现#include stdbool.h #include stdlib.h bool isSymmetric(struct TreeNode* root) { if (!root) return true; struct TreeNode* queue[2000]; int front 0, rear 0; queue[rear] root-left; queue[rear] root-right; while (front rear) { struct TreeNode* left queue[front]; struct TreeNode* right queue[front]; if (!left !right) continue; if (!left || !right) return false; if (left-val ! right-val) return false; queue[rear] left-left; queue[rear] right-right; queue[rear] left-right; queue[rear] right-left; } return true; }⚠️ 五、常见错误总结面试高频坑❌ 错误 1写成“同方向比较”isMirror(left-left, right-left) // ❌ 错 这是判断“相同”不是“镜像”❌ 错误 2只写一个参数递归dfs(root) 无法表达“两棵树比较”❌ 错误 3漏掉空节点判断 很容易 SEGFAULT 六、复杂度分析方法时间复杂度空间复杂度递归O(n)O(h)迭代O(n)O(n) 七、面试一句话总结这题的核心是把“对称”转化为“镜像比较”使用递归函数同时遍历左右子树并进行交叉判断。✅ 八、推荐记忆模板必背return check(l-left, r-right) check(l-right, r-left);