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) {
queue<TreeNode*> left,right;
if(!root||(!root->left && !root->right) ) return true;
TreeNode* lp;TreeNode* rp;
if(root->left) left.push(root->left);
if(root->right) right.push(root->right);
while(!left.empty()&&!right.empty())
{
lp=left.front();
rp=right.front();
if(lp->val!=rp->val)
return false;
if(lp->left) left.push(lp->left);
if(lp->right) left.push(lp->right);
if(rp->right) right.push(rp->right);
if(rp->left) right.push(rp->left);
left.pop();
right.pop();
}
if(left.size()!=right.size())
return false;
return true;
}
};
此代码存在问题!
1 / \ 2 2 \ \ 3 3对于上面的test就无法得出正确答案。
正确代码如下:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
queue<TreeNode*> check;
check.push(root->left);
check.push(root->right);
while (!check.empty()) {
TreeNode* node1 = check.front();
check.pop();
TreeNode* node2 = check.front();
check.pop();
if (!node1 && node2) return false;
if (!node2 && node1) return false;
if (node1 && node2) {
if (node1->val != node2->val) return false;
check.push(node1->left);
check.push(node2->right);
check.push(node1->right);
check.push(node2->left);
}
}
return true;
}
};
树的遍历的基础。