LeetCode 101. 对称二叉树
📌 题目描述
题目级别:简单
给你一个二叉树的根节点 root , 检查它是否轴对称。
-
示例 1:
输入:
root = [1,2,2,3,4,4,3]输出:
true -
示例 2:
输入:
root = [1,2,2,null,3,null,3]输出:
false
💡 破题思路:递归 (DFS 同步双指针)
判断一棵树是否对称,本质上是判断它的左子树和右子树是否互为镜像 。
这需要我们派出两个指针 l 和 r,分别去巡视左子树和右子树。巡视的规则必须像照镜子一样:
- 基本盘校验 :
- 如果
l和r都为空,说明对称(到了叶子节点的下面)。 - 如果
l和r只有一个为空,或者它们的值不相等,说明不对称,直接判死刑(false)。
- 如果
- 镜像前行(核心魔法) :
- 外侧对外侧 :左指针往左走的同时,右指针必须往右走,去比较
l->left和r->right。 - 内侧对内侧 :左指针往右走的同时,右指针必须往左走,去比较
l->right和r->left。 - 只有当外侧和内侧都对称时,这棵树才是真正的对称树。
- 外侧对外侧 :左指针往左走的同时,右指针必须往右走,去比较
💻 C++ 代码实现 (极简递归版)
cpp
class Solution {
public:
bool isSymmetric(TreeNode* root) {
// 如果树为空,天然对称;否则开启双指针镜像递归
return !root || dfs(root->left, root->right);
}
bool dfs(TreeNode* l, TreeNode* r)
{
// 1. 两人同时走到空节点,说明一路过来都对称
if (!l && !r) return true;
// 2. 只有一人为空,或者两人的值不相等,结构/数值被破坏,不对称
else if (!l || !r || l->val != r->val) return false;
// 3. 镜像递归:比较外侧节点 && 比较内侧节点
return dfs(l->left, r->right) && dfs(l->right, r->left);
}
};