给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
解析:两种方法,递归与迭代
对于递归方法,构建辅助函数,接受两个节点,每次比较这两个节点是否相同,若相同,则递归比较这两个节点的左右子节点。
对于迭代方法,利用队列模拟函数调用栈,算法与递归大致相同。
//递归
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==nullptr)
return true;
return issame(root,root);
}
bool issame(TreeNode* p,TreeNode* q)
{
if(p==nullptr&&q==nullptr)
return true;
if(p!=nullptr&&q!=nullptr&&p->val==q->val)
{
return issame(p->left,q->right)&&issame(p->right,q->left);
}
else
return false;
}
};
//迭代
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==nullptr) return true;
queue<TreeNode*> q;
q.push(root);
q.push(root);
TreeNode *a,*b;
while(!q.empty()){
a = q.front();
q.pop();
b = q.front();
q.pop();
if(a==nullptr&&b==nullptr) continue;
if(a==nullptr||b==nullptr) return false;
if(a->val!=b->val) return false;
q.push(a->left);
q.push(b->right);
q.push(a->right);
q.push(b->left);
}
return true;
}
};