Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
class Solution {
public:
/*//dfs
bool isSymmetric(TreeNode* root) {
if(root==NULL) return true;
return dfs(root->left, root->right);//把根的左右子树看成两树,这两个树要对称 O(n)
}
bool dfs(TreeNode* node1, TreeNode* node2){
if(node1==NULL&&node2==NULL) return true; //都为空,表示对称
if(node1!=NULL&&node2!=NULL) //都不为空时,若要对称,当前两点的值要相同,并且node1->left和node2->right、
//node1->right和node2->left 要分别对称
return (node1->val==node2->val)&&dfs(node1->left, node2->right)&&dfs(node1->right, node2->left);
return false;
}*/
//迭代 bfs(使用先进先出的队列)
bool isSymmetric(TreeNode* root) {
if(root==NULL) return true;
queue<pair<TreeNode*, TreeNode*>> q;
pair<TreeNode*, TreeNode*> tmp1(root->left, root->right), tmp2;
q.push(tmp1);
while(q.size()>0){
tmp1 = q.front();
q.pop();
if(tmp1.first==NULL&&tmp1.second==NULL) continue;
if(tmp1.first!=NULL&&tmp1.second!=NULL&&tmp1.first->val==tmp1.second->val){
tmp2.first = tmp1.first->left;
tmp2.second = tmp1.second->right;
q.push(tmp2);
tmp2.first = tmp1.first->right;
tmp2.second = tmp1.second->left;
q.push(tmp2);
}
else return false;
}
return true;
}
};