首页 > 代码库 > [LeetCode] Symmetric Tree

[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

 

 
 
 
 
 
 
 
 
 
 

[LeetCode] Symmetric Tree