[面试真题] LeetCode:Symmetric Tree

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

Progress: 190/190 test cases passed.
 

解法 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

Progress: 190/190 test cases passed.
 
posted @ 2013-05-12 14:50  infinityu  阅读(207)  评论(0编辑  收藏  举报