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); } };