[LeetCode] Symmetric Tree

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.

 

Hide Tags
 Tree Depth-first Search
 

  这个嘛,用两个队列,一个维护树从左到右,一个维护树的从右到左。这就好了。写了两个,一个识queue 中是已经已经符合的,弹出后判断其子节点是否符合,这样queue 中不维护NULL。
 1 class Solution {
 2 public:
 3     bool isSymmetric(TreeNode *root) {
 4         if(root==NULL||(root->left==NULL&&root->right==NULL))  return true;
 5         if(root->left==NULL||root->right==NULL||root->left->val!=root->right->val)   return false;
 6         queue<TreeNode*> lft;
 7         lft.push(root->left);
 8         queue<TreeNode*> rgt;
 9         rgt.push(root->right);
10         while(( !lft.empty() )||( !rgt.empty() )){
11             int nlft=lft.size(),nrgt=rgt.size();
12             if(nlft!=nrgt)  return false;
13             for(int i=0;i<nlft;i++){
14                 TreeNode* curlft=lft.front(),*currgt=rgt.front();
15                 if( (curlft->left==NULL&&currgt->right!=NULL) ||
16                     (curlft->right==NULL&&currgt->left!=NULL) ) return false;
17                 if(curlft->left!=NULL&&
18                    currgt->right!=NULL&&
19                    curlft->left->val!=currgt->right->val)   return false;
20                 if(curlft->right!=NULL&&
21                    currgt->left!=NULL&&
22                    curlft->right->val!=currgt->left->val)   return false;
23                 if(curlft->left!=NULL)  lft.push(curlft->left);
24                 if(curlft->right!=NULL) lft.push(curlft->right);
25                 if(currgt->right!=NULL) rgt.push(currgt->right);
26                 if(currgt->left!=NULL)  rgt.push(currgt->left);
27                 lft.pop();
28                 rgt.pop();
29             }
30         }
31         return true;
32     }
33 };
View Code

 

  一个是queue 中维护未判断的,包括NULL,这样写逻辑比较简单。
 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 /**
 5  * Definition for binary tree
 6  */
 7 struct TreeNode {
 8     int val;
 9     TreeNode *left;
10     TreeNode *right;
11     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
12 };
13 /**
14 class Solution {
15 public:
16     bool isSymmetric(TreeNode *root) {
17         if(root==NULL||(root->left==NULL&&root->right==NULL))  return true;
18         if(root->left==NULL||root->right==NULL||root->left->val!=root->right->val)   return false;
19         queue<TreeNode*> lft;
20         lft.push(root->left);
21         queue<TreeNode*> rgt;
22         rgt.push(root->right);
23         while(( !lft.empty() )||( !rgt.empty() )){
24             int nlft=lft.size(),nrgt=rgt.size();
25             if(nlft!=nrgt)  return false;
26             for(int i=0;i<nlft;i++){
27                 TreeNode* curlft=lft.front(),*currgt=rgt.front();
28                 if( (curlft->left==NULL&&currgt->right!=NULL) ||
29                     (curlft->right==NULL&&currgt->left!=NULL) ) return false;
30                 if(curlft->left!=NULL&&
31                    currgt->right!=NULL&&
32                    curlft->left->val!=currgt->right->val)   return false;
33                 if(curlft->right!=NULL&&
34                    currgt->left!=NULL&&
35                    curlft->right->val!=currgt->left->val)   return false;
36                 if(curlft->left!=NULL)  lft.push(curlft->left);
37                 if(curlft->right!=NULL) lft.push(curlft->right);
38                 if(currgt->right!=NULL) rgt.push(currgt->right);
39                 if(currgt->left!=NULL)  rgt.push(currgt->left);
40                 lft.pop();
41                 rgt.pop();
42             }
43         }
44         return true;
45     }
46 };
47 */
48 
49 class Solution {
50 public:
51     bool isSymmetric(TreeNode *root) {
52         if(root==NULL)  return true;
53         queue<TreeNode* > lft,rgt;
54         lft.push(root->left);
55         rgt.push(root->right);
56         while((!lft.empty())||(!rgt.empty())){
57             TreeNode * curlft=lft.front(),*currgt=rgt.front();
58             lft.pop();
59             rgt.pop();
60             if(curlft==NULL&&currgt==NULL)  continue;
61             if(curlft==NULL||currgt==NULL||curlft->val!=currgt->val)  return false;
62             lft.push(curlft->left);
63             lft.push(curlft->right);
64             rgt.push(currgt->right);
65             rgt.push(currgt->left);
66         }
67         return true;
68     }
69 };
70 
71 int main()
72 {
73 
74     return 0;
75 }
View Code

 

 
 
 
 
 
 
 
 
 
 
posted @ 2014-12-14 00:00  A_zhu  阅读(194)  评论(0编辑  收藏  举报