对称二叉树

737 字
4 分钟
对称二叉树

题目链接:101. 对称二叉树 - 力扣(LeetCode)

  • 难度:简单
  • 标签:树、深度优先搜索、广度优先搜索、二叉树

题目描述#

Note

原题说明: 给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1(对称)#

graph TD 1((1)) --- 2L((2)) 1((1)) --- 2R((2)) 2L((2)) --- 3LL((3)) 2L((2)) --- 4LR((4)) 2R((2)) --- 4RL((4)) 2R((2)) --- 3RR((3))

输出true

示例 2(不对称)#

graph TD 1((1)) --- 2L((2)) 1((1)) --- 2R((2)) 2L((2)) --- null1[null] 2L((2)) --- 3LR((3)) 2R((2)) --- null2[null] 2R((2)) --- 3RR((3)) style null1 fill:none,stroke:none style null2 fill:none,stroke:none

输出false


避坑指南:中序遍历回文是否可行?#

Warning

思考陷阱: 有同学可能会想:“如果一棵树是对称的,那它的中序遍历结果一定是一个回文数组吧?”

答案是不一定。虽然对称二叉树的中序遍历确实是回文的,但反之不成立。例如:[1, 2, 2, 2, null, 2]。如果仅仅依靠中序遍历结果,会由于丢失了层级结构信息(尤其是 null 节点的位置)而导致判断失误。因此,必须使用直接操作树结构的算法。


方案一:递归 DFS(镜像比对)#

核心思路: 判断一棵树是否对称,等价于判断其左子树右子树是否互为镜像。

  • 镜像的规则:
    1. 两个节点值相等。
    2. 左树的左子树 与 右树的右子树 镜像。
    3. 左树的右子树 与 右树的左子树 镜像。

源码实现#

class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
return isMirror(root->left, root->right);
}
private:
bool isMirror(TreeNode* L, TreeNode* R) {
if (!L && !R) return true; // 都为空,匹配
if (!L || !R) return false; // 一个空一个不空,不匹配
// 值匹配 且 交叉位匹配
return (L->val == R->val)
&& isMirror(L->left, R->right)
&& isMirror(L->right, R->left);
}
};

复杂度分析#

  • 时间复杂度O(n)O(n)。需要遍历整棵树的所有节点。
  • 空间复杂度O(h)O(h)。取决于递归栈的最大深度,即树的高度。

方案二:迭代解法(队列辅助)#

核心思路: 使用队列(或栈)成对地存入需要进行镜像比对的节点。每次取出两个节点进行对比,并将它们的子节点按“镜像顺序”再次压入队列。

源码实现#

#include <queue>
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
while (!q.empty()) {
TreeNode* L = q.front(); q.pop();
TreeNode* R = q.front(); q.pop();
if (!L && !R) continue;
if (!L || !R || L->val != R->val) return false;
// 按照镜像顺序成对入队
q.push(L->left); // 左的左
q.push(R->right); // 右的右
q.push(L->right); // 左的右
q.push(R->left); // 右的左
}
return true;
}
};

总结#

  • 镜像逻辑的精髓:在于“内侧”比“内侧”(L->right vs R->left),“外侧”比“外侧”(L->left vs R->right)。
  • 结构化思维:处理树类问题时,始终要思考如何将大树拆解为可以递归处理的子任务。
Important

理解了“镜像”的递归定义,你就掌握了二叉树对称性问题的万能钥匙!

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

对称二叉树
https://firefly-7a0.pages.dev/posts/leetcode_notes/101symmetric-tree/
作者
lonelystar
发布于
2025-10-25
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-10-25,距今已过 186 天

部分内容可能已过时

评论区

Profile Image of the Author
LonelyStar
Hello, I'm LonelyStar.
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
119
分类
11
标签
346
总字数
226,548
运行时长
0
最后活动
0 天前

目录