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

示例 1:

**输入:**root = [1,2,2,3,4,4,3]
**输出:**true

示例 2:

**输入:**root = [1,2,2,null,3,null,3]
**输出:**false

提示:

树中节点数目在范围 [1, 1000] 内

-100 <= Node.val <= 100

**进阶:**你可以运用递归和迭代两种方法解决这个问题吗?

递归法:从根开始递归比较左节点和右节点,

如果相等则继续递归比较左节点的左孩子和右节点右孩子、左节点的右孩子和右节点的左孩子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
bool isSymmetric(TreeNode *root) {
if (root == nullptr)
return true;
return isSym(root->left, root->right);
}
bool isSym(TreeNode *left, TreeNode *right) {
if (left == nullptr && right == nullptr)
return true;
if (left == nullptr || right == nullptr)
return false;
return left->val == right->val && isSym(left->left, right->right) &&
isSym(left->right, right->left);
}
};

迭代法:类似层序遍历,注意入队节点即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
bool isSymmetric(TreeNode *root) {
if (root == nullptr)
return true;
queue<TreeNode *> q;
q.push(root->left);
q.push(root->right);
while (!q.empty()) {
TreeNode *left = q.front();
q.pop();
TreeNode *right = q.front();
q.pop();
if (left == nullptr && right == nullptr)
continue;
if (left == nullptr || right == nullptr)
return false;
if (left->val != right->val)
return false;
q.push(left->left);
q.push(right->right);
q.push(left->right);
q.push(right->left);
}
return true;
}
};