方法一:递归法
class Solution {
public:
bool check(TreeNode *left,TreeNode *right){
//左子树和右子树的节点同时是空的是对称的
if(left==nullptr&&right==nullptr){
return true;
}
if(left==nullptr||right==nullptr){
return false;
}
//检查左右子树的值相不相等,再检查左子树的左节点是不是和右子树的右节点相同,左子树的右节点是不是和右子树的左节点相同
return left->val==right->val&&check(left->left,right->right)&&check(left->right,right->left);
}
bool isSymmetric(TreeNode* root) {
return check(root->left,root->right);
}
};
时间复杂度:O(n)
空间复杂度:O(n)
方法二:迭代法,用队列
class Solution {
public:
bool check(TreeNode *u,TreeNode *v){
queue<TreeNode*>q;
q.push(u);q.push(v);
while(!q.empty()){
u=q.front();q.pop();
v=q.front();q.pop();
if(!u&&!v) continue;
if((!u||!v)||(u->val!=v->val)) return false;
q.push(u->left);q.push(v->right);
q.push(u->right);q.push(v->left);
}
return true;
}
bool isSymmetric(TreeNode* root) {
return check(root,root);
}
};
时间复杂度:O(n)
空间复杂度:O(n)