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:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return helper(root->left, root->right);
}
bool helper(TreeNode *p, TreeNode *q)
{
if(!p && !q)
return true;
if(!p || !q)
return false;
if( p->val != q->val )
return false;
return helper(p->left,q->right) && helper(p->right, q->left);
}
};
非递归:class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
if(!root->left&&!root->right) return true;
if(!root->left&&root->right || root->left&&!root->right) return false;
deque<TreeNode *> dq;
dq.push_back(root->left);
dq.push_back(root->right);
while(!dq.empty())
{
TreeNode * lroot = dq.front();
TreeNode * rroot = dq.back();
dq.pop_front();
dq.pop_back();
if(lroot->val!=rroot->val) return false;
if(!lroot->left&&rroot->right || lroot->left&&!rroot->right) return false;
if(lroot->left)
{
dq.push_front(lroot->left);
dq.push_back(rroot->right);
}
if(lroot->right&&!rroot->left || !lroot->right&&rroot->left) return false;
if(lroot->right)
{
dq.push_front(lroot->right);
dq.push_back(rroot->left);
}
}
return true;
}
};