您的位置:首页 > 其它

[LeetCode] Symmetric Tree

2014-12-14 00:00 399 查看
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。

#include <iostream>
#include <queue>
using namespace std;
/**
* Definition for binary tree
*/
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
/**
class Solution {
public:
bool isSymmetric(TreeNode *root) {
if(root==NULL||(root->left==NULL&&root->right==NULL))  return true;
if(root->left==NULL||root->right==NULL||root->left->val!=root->right->val)   return false;
queue<TreeNode*> lft;
lft.push(root->left);
queue<TreeNode*> rgt;
rgt.push(root->right);
while(( !lft.empty() )||( !rgt.empty() )){
int nlft=lft.size(),nrgt=rgt.size();
if(nlft!=nrgt)  return false;
for(int i=0;i<nlft;i++){
TreeNode* curlft=lft.front(),*currgt=rgt.front();
if( (curlft->left==NULL&&currgt->right!=NULL) ||
(curlft->right==NULL&&currgt->left!=NULL) ) return false;
if(curlft->left!=NULL&&
currgt->right!=NULL&&
curlft->left->val!=currgt->right->val)   return false;
if(curlft->right!=NULL&&
currgt->left!=NULL&&
curlft->right->val!=currgt->left->val)   return false;
if(curlft->left!=NULL)  lft.push(curlft->left);
if(curlft->right!=NULL) lft.push(curlft->right);
if(currgt->right!=NULL) rgt.push(currgt->right);
if(currgt->left!=NULL)  rgt.push(currgt->left);
lft.pop();
rgt.pop();
}
}
return true;
}
};
*/

class Solution {
public:
bool isSymmetric(TreeNode *root) {
if(root==NULL)  return true;
queue<TreeNode* > lft,rgt;
lft.push(root->left);
rgt.push(root->right);
while((!lft.empty())||(!rgt.empty())){
TreeNode * curlft=lft.front(),*currgt=rgt.front();
lft.pop();
rgt.pop();
if(curlft==NULL&&currgt==NULL)  continue;
if(curlft==NULL||currgt==NULL||curlft->val!=currgt->val)  return false;
lft.push(curlft->left);
lft.push(curlft->right);
rgt.push(currgt->right);
rgt.push(currgt->left);
}
return true;
}
};

int main()
{

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: