Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Note:Bonus points if you could solve it both recursively and iteratively.
解法 1:非递归解法
使用双端队列dequeue记录对称的节点,依次从dequeue的头尾取出两个节点进行判断,两个节点的值以及节点左右孩子结构分别相同的情况下,将他们的孩子按顺序加入dequeue。再依次从dequeue的头尾取出两个节点进行判断,直到dequeue为空。
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 bool isSymmetric(TreeNode *root) { 13 // Start typing your C/C++ solution below 14 // DO NOT write int main() function 15 if(NULL == root){ 16 return true; 17 } 18 if((root->left && !root->right) || (!root->left && root->right)){ 19 return false; 20 } 21 if(!root->left && !root->right){ 22 return true; 23 } 24 if(root->left->val != root->right->val){ 25 return false; 26 } 27 deque<TreeNode*> dq; 28 dq.push_front(root->left); 29 dq.push_back(root->right); 30 while(dq.size()){ 31 TreeNode *l = dq.front(); 32 dq.pop_front(); 33 TreeNode *r = dq.back(); 34 dq.pop_back(); 35 if(l->val != r->val){ 36 return false; 37 } 38 if(l->left && r->right){ 39 dq.push_front(l->left); 40 dq.push_back(r->right); 41 }else if((l->left && !r->right) || (!l->left && r->right)){ 42 return false; 43 } 44 if(l->right && r->left){ 45 dq.push_front(l->right); 46 dq.push_back(r->left); 47 }else if((l->right && !r->left) || (!l->right && r->left)){ 48 return false; 49 } 50 } 51 return true; 52 } 53 };
Run Status: Accepted!
Program Runtime: 20 milli secs
解法 2:递归解法
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 bool isSymmetric(TreeNode *left, TreeNode *right) { 12 if(left && right){ 13 if(left->val != right->val){ 14 return false; 15 } 16 } 17 if((left && !right) || (!left && right)){ 18 return false; 19 } 20 if(!left && !right){ 21 return true; 22 } 23 if(left->left){ 24 if(!right->right){ 25 return false; 26 }else{ 27 if(left->left->val != right->right->val){ 28 return false; 29 } 30 } 31 }else{ 32 if(right->right){ 33 return false; 34 } 35 } 36 if(left->right){ 37 if(!right->left){ 38 return false; 39 }else{ 40 if(left->right->val != right->left->val){ 41 return false; 42 } 43 } 44 }else{ 45 if(right->left){ 46 return false; 47 } 48 } 49 return (left->left ? isSymmetric(left->left, right->right) : true) && (left->right ? isSymmetric(left->right, right->left) : true); 50 } 51 52 public: 53 bool isSymmetric(TreeNode *root) { 54 // Start typing your C/C++ solution below 55 // DO NOT write int main() function 56 if(NULL == root){ 57 return true; 58 } 59 return isSymmetric(root->left, root->right); 60 } 61 };
Run Status: Accepted!
Program Runtime: 24 milli secs