给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
两种方法:
1、递归
class Solution {
public:
bool makeSym(TreeNode* p, TreeNode* q) {
if (p == nullptr && q == nullptr) return true;
else if (p == nullptr || q == nullptr) return false;
else if (p->val == q->val) return (makeSym(p->left, q->right) && makeSym(p->right, q->left));
else return false;
}
bool isSymmetric(TreeNode* root) {
if (root == nullptr) return true;
return makeSym(root->left, root->right);
}
};
2、迭代,用队列存储遍历结果,本来想层次遍历,每次用这一层是否是回文串来判断,但是实现起来有困难,最后用了与递归逻辑相同的方法。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (root == nullptr) return true;
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
TreeNode* leftNode = nullptr;
TreeNode* rightNode = nullptr;
while (!q.empty()) {
leftNode = q.front();
q.pop();
rightNode = q.front();
q.pop();
if (leftNode == nullptr && rightNode == nullptr) continue;
if (leftNode == nullptr || rightNode == nullptr) return false;
if (leftNode->val != rightNode->val) return false;
else {
q.push(leftNode->left);
q.push(rightNode->right);
q.push(leftNode->right);
q.push(rightNode->left);
}
}
return true;
}
};