对称二叉树判定
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
- 实现思路:
可以将整棵树分为左子树和右子树,通过遍历左右子树来判定是否对称。
判定依据:
1、左子树判断步骤:left->root->right
2、右子树判断步骤:right->root->left
3、即使有了1、2步骤还是可能出现提示镜像并不对称的情况,这里引入每次计数,因为就算左右子树遍历结果一样,但是每个节点的遍历次序是不同的!
/**
* Definition for a binary tree node.
* 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)
return true;
if(root->left == NULL && root->right == NULL)
return true;
if( root->left == NULL || root->right == NULL)
return false;
map<int, int> _left = infixOrder(root->left, 0);
map<int, int> _right = infixOrder(root->right, 1);
if(_left.size() != _right.size())
return false;
map<int, int>::iterator It1;
map<int, int>::iterator It2;
for(It1=_left.begin(), It2=_right.begin(); It1!=_left.end(); It1++, It2++)
{
if(It1->first != It2->first || It1->second != It2->second)
return false;
}
return true;
}
map<int, int> infixOrder(TreeNode* root, int mark)
{
map<int, int> res;
int count = 0;
stack<TreeNode*> S;
TreeNode* p = root;
while( p!= NULL || !S.empty())
{
if( p!= NULL)
{
S.push(p);
if(mark == 0)
p = p->left;
else
p = p->right;
}
else{
p = S.top();
S.pop();
res.insert(pair<int, int>(p->val, count));
if(mark == 0)
p = p->right;
else
p = p->left;
}
count++;
}
return res;
}
};