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.
-----SOLUTION-----
class Solution { public: bool isSymmetric(TreeNode *root) { if(!root) return true; bool result; if((root->left==NULL && root->right != NULL) ||(root->left!=NULL && root->right == NULL)) { return false; } else if(root->left == NULL && root->right == NULL) { return true; } else { result = cmp(root->left, root->right); } } bool cmp(TreeNode * node1, TreeNode* node2) { int result1 = true; int result2 = true; if(node1->val!=node2->val) return false; else { if((node1->left==NULL && node2->right != NULL) || (node1->left!=NULL && node2->right == NULL)|| (node1->right!=NULL && node2->left == NULL)|| (node1->right==NULL && node2->left != NULL)) { return false; } if((node1->left == NULL && node2->right == NULL)&& (node1->right == NULL && node2->left== NULL)) { return true; } if(node1->left != NULL) { result1 = cmp(node1->left,node2->right); } if(node1->right != NULL) { result2 = cmp(node1->right,node2->left); } return (result1 && result2); } } };
class Solution { public: bool isSymmetric(TreeNode *root) { // Note: The Solution object is instantiated only once and is reused by each test case. if(root == NULL) return true; queue<TreeNode*> q; q.push(root->left); q.push(root->right); TreeNode *t1, *t2; while(!q.empty()){ t1 = q.front(); q.pop(); t2 = q.front(); q.pop(); if(t1 == NULL && t2 == NULL) continue; if(t1 == NULL || t2 == NULL || t1->val != t2->val) return false; q.push(t1->left); q.push(t2->right); q.push(t1->right); q.push(t2->left); } return true; } };
原文:http://blog.csdn.net/joannae_hu/article/details/38299447