Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
我采用的是层次遍历的思想
class Solution {
public:
bool isSymmetric(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
TreeNode **array=new TreeNode*[10000];
TreeNode **array1=new TreeNode*[10000];
memset(array,NULL,sizeof(TreeNode*)*10000);
memset(array1,NULL,sizeof(TreeNode*)*10000);
int count1=0,count2=0;
if(!root)
return true;
_leftleveltraverse(root,array,count1);
_rightleveltraverse(root,array1,count2);
if(count1!=count2)
return false;
for(int i=0 ; i<count1 ; i++){
if(!array[i] && !array1[i])
continue;
if(array[i] && array1[i] && array[i]->val==array1[i]->val)
continue;
else
return false;
}
delete []array;
delete []array1;
return true;
}
void _leftleveltraverse(TreeNode* root, TreeNode **array, int &q){
array[0]=root;
int p=0;
q=1;
for(;p!=q;p++){
if(array[p]==NULL)
continue;
array[q++]=array[p]->left;
array[q++]=array[p]->right;
}
}
void _rightleveltraverse(TreeNode* root, TreeNode **array, int &q){
array[0]=root;
int p=0;
q=1;
for(;p!=q;p++){
if(array[p]==NULL)
continue;
array[q++]=array[p]->right;
array[q++]=array[p]->left;
}
}
};
当然也可以使用递归的思想:
class Solution {
public:
bool isSymmetric(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (root == NULL)
return true;
return check(root->left, root->right);
}
bool check(TreeNode *leftNode, TreeNode *rightNode) {
if (leftNode == NULL && rightNode == NULL)
return true;
if (leftNode == NULL || rightNode == NULL)
return false;
return leftNode->val == rightNode->val && check(leftNode->left, rightNode->right) &&
check(leftNode->right, rightNode->left);
}
};