对称二叉树
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(镜像比对)
核心思路: 判断一棵树是否对称,等价于判断其左子树和右子树是否互为镜像。
- 镜像的规则:
- 两个节点值相等。
- 左树的左子树 与 右树的右子树 镜像。
- 左树的右子树 与 右树的左子树 镜像。
源码实现
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); }};复杂度分析
- 时间复杂度:。需要遍历整棵树的所有节点。
- 空间复杂度:。取决于递归栈的最大深度,即树的高度。
方案二:迭代解法(队列辅助)
核心思路: 使用队列(或栈)成对地存入需要进行镜像比对的节点。每次取出两个节点进行对比,并将它们的子节点按“镜像顺序”再次压入队列。
源码实现
#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->rightvsR->left),“外侧”比“外侧”(L->leftvsR->right)。 - 结构化思维:处理树类问题时,始终要思考如何将大树拆解为可以递归处理的子任务。
Important
理解了“镜像”的递归定义,你就掌握了二叉树对称性问题的万能钥匙!
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
最后更新于 2025-10-25,距今已过 186 天
部分内容可能已过时
相关文章 智能推荐
1
二叉树的中序遍历
算法 力扣第94题:二叉树的中序遍历。从递归的简洁到迭代的深度剖析,掌握树结构遍历的核心逻辑。
2
二叉树的最大深度
算法 力扣第104题:二叉树的最大深度。深入理解递归与广度优先搜索(BFS)在计算树结构深度时的应用场景。
3
相同的树
算法 力扣第100题:相同的树。利用深度优先搜索(DFS)的递归特性,优雅地判断两棵二叉树的结构与数值一致性。
4
二叉树的层序遍历
算法 力扣第102题:二叉树的层序遍历。掌握广度优先搜索(BFS)的核心机制,学习如何按层级剥开树结构的逻辑脉络。
5
二叉树的层序遍历 II
算法 力扣第107题:二叉树的层序遍历 II。在层序遍历的基础上,学习如何通过简单的结果反转实现自底向上的层级展示。
随机文章 随机推荐