本题源自剑指offer
-----------------------------------------------------------------------
可以自定以一种对称前序遍历,即先遍历父节点,再访问右子节点,在访问左子节点,NULL节点也访问,将得到的序列和前序遍历比较,相同就说明二叉树是对称的。
递归:
bool isSymmetrical(TreeNode* pRoot)
{
return IsSymmetricalCore(pRoot,pRoot);
}
bool IsSymmetricalCore(TreeNode* pRoot1,TreeNode* pRoot2){
if(pRoot1==NULL && pRoot2==NULL)
return true;
if(pRoot1==NULL || pRoot2==NULL)
return false;
if(pRoot1->val!=pRoot2->val)
return false;
return IsSymmetricalCore(pRoot1->left,pRoot2->right)&&IsSymmetricalCore(pRoot1->right,pRoot2->left);
}
迭代:
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot==NULL)
return true;
TreeNode* left=pRoot->left;
TreeNode* right=pRoot->right;
queue<TreeNode*> q1,q2;
q1.push(left);
q2.push(right);
while(!q1.empty()&&!q2.empty()){
left=q1.front();
q1.pop();
right=q2.front();
q2.pop();
if(left==NULL&&right==NULL)
continue;
if(left==NULL||right==NULL)
return false;
if(left->val!=right->val)
return false;
//俩个队列的左右节点入栈顺序相反。
q1.push(left->left);
q1.push(left->right);
q2.push(right->right);
q2.push(right->left);
}
return true;
}