题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
前面做过一道题目—— 二叉树的镜像。根据提示,可以求出左子树的镜像,然后看是否等于右子树,如果相等,则二叉树是对称的。
为了不改变二叉树,定义节点指针 pTemp 指向左子树根节点,带入镜像函数求其镜像。
用递归比较两个二叉树是否相等。(两个节点的左子树要么都为空,要么都不为空,右子树也是一样。都为空的话对称,都不为空看两个节点是否相等,再比较左右子树是否相等)
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot == NULL) return true;
TreeNode* pLeft = pRoot->left;
TreeNode* pRight = pRoot->right;
if(pLeft == NULL || pRight == NULL)
{
if(pLeft == NULL && pRight == NULL)
return true;
else
return false;
}
TreeNode* pTemp = pLeft;
Mirror(pTemp);
return compare(pTemp, pRight);
}
void Mirror(TreeNode *pRoot) {
TreeNode *node = pRoot, *temp = NULL;
if(pRoot == NULL) return;
if(node->left != NULL && node->right != NULL)
{
temp = node->left;
node->left = node->right;
node->right = temp;
}
else if(node->left != NULL)
{
node->right = node->left;
node->left = NULL;
}
else if(node->right != NULL)
{
node->left = node->right;
node->right = NULL;
}
else
return;
//if(node->left != NULL)
Mirror(node->left);
//if(node->right != NULL)
Mirror(node->right);
}
bool compare(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == NULL && pRoot2 == NULL)
return true;
if(pRoot1->val != pRoot2->val)
return false;
if(pRoot1->left != NULL && pRoot2->left == NULL || pRoot1->left == NULL && pRoot2->left != NULL)
return false;
if(pRoot1->right != NULL && pRoot2->right == NULL || pRoot1->right == NULL && pRoot2->right != NULL)
return false;
return compare(pRoot1->left, pRoot2->left) && compare(pRoot1->right, pRoot2->right);
}
};