码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] Symmetric Tree

时间:2014-12-14 00:43:17      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

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。
bubuko.com,布布扣
 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,这样写逻辑比较简单。
bubuko.com,布布扣
 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

 

 
 
 
 
 
 
 
 
 
 

[LeetCode] Symmetric Tree

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/Azhu/p/4162106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!