1:解题思路
1:判断一颗树是否为镜像对称,根节点不需要考虑,只需要考虑左子树和右子树是否镜像对称就行。那么判断左子树和右子树是否镜像对称需要几步呢。
2:首先先判断左子树的根节点和右子树的根节点是否相同(这一步简单);然后判断左子树的左子树和右子树的右子树是否镜像对称(还是两棵树是否镜像对称问题,递归);最后判断左子树的右子树和右子树的左子树是否镜像对称(递归)。
2:递归代码
bool Compare(struct TreeNode *leftTree,struct TreeNode *rightTree)
{
//先考虑树为空的情况
if(leftTree==NULL&&rightTree!=NULL)
{
return false;
}else if(leftTree!=NULL&&rightTree==NULL)
{
return false;
}else if(leftTree==NULL&&rightTree==NULL)
{
return true;
}
if(leftTree->val==rightTree->val)
{
if(Compare(leftTree->left,rightTree->right)&&Compare(leftTree->right,rightTree->left))
{
return true;
}
}else
{
return false;
}
return ;
}
bool isSymmetric(struct TreeNode* root){
return Compare(root->left,root->right);
}
3:迭代思想
1:借助一个队列,先将书的左子树根节点入队,再将树的右子树根节点入队。
2:将队列中的元素出队(一次出两个)并保存(记住tempLeft,tempRight),判断出队的两个节点的val是否相同。如果相同则执行下一步
3:将保存的tempLeft的左子树的根节点和tempRight的右子树先后入队,再将tempLeft的右子树的根节点和tempRight的左子树先后入队。再执行第2点。
4:迭代代码
bool isSymmetric(struct TreeNode* root){
struct TreeNode *queue[2000];
int rear=0,front=0;
queue[rear++]=root->left;
queue[rear++]=root->right;
while(rear!=front)
{
struct TreeNode *tempLeft=queue[front++];
struct TreeNode *tempRight=queue[front++];
//比较出栈的元素的val是否相同
if(tempLeft&&tempRight)
{
if(tempLeft->val==tempRight->val)
{
queue[rear++]=tempLeft->left;
queue[rear++]=tempRight->right;
queue[rear++]=tempLeft->right;
queue[rear++]=tempRight->left;
}
else
{
return false;
}
}else if(tempLeft==tempRight)
{
}else
{
return false;
}
}
return true;
}