剑指offer-刷题笔记-简单题-JZ28 对称的二叉树
版本1-自己写的很复杂
class Solution {
public:
TreeNode* Mirror(TreeNode* pRoot) {
if(pRoot == nullptr)
{
return pRoot;
}
else{
TreeNode* temp;
temp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = temp;
pRoot->left = Mirror(pRoot->left);
pRoot->right = Mirror(pRoot->right);
}
return pRoot;
}
void CopyBiTree(TreeNode* root, TreeNode* newroot)
{
if (root == nullptr)
return;
else
{
newroot->val = root->val;
if (root->left != nullptr)
newroot->left = new TreeNode(0);
if (root->right != nullptr)
newroot->right = new TreeNode(0);
CopyBiTree(root->left, newroot->left);
CopyBiTree(root->right, newroot->right);
}
}
bool isSameTree(TreeNode* p,TreeNode* q)
{
if(p == nullptr && q == nullptr){
return true;
}
if(p == nullptr || q == nullptr){
return false;
}
if(p->val != q->val){
return false;
}
return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
bool isSymmetrical(TreeNode* pRoot) {
TreeNode* prepRoot = new TreeNode(0) ;
CopyBiTree(pRoot, prepRoot);
TreeNode* MirrorpRoot = Mirror(pRoot);
if(pRoot == nullptr|| (pRoot->left == nullptr)&&(pRoot->right == nullptr))
{
return true;
}
if(isSameTree(MirrorpRoot,prepRoot))
{
return true;
}else{
return false;
}
}
};
版本2 - 递归
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right)
{
if((left == nullptr && right == nullptr))
{
return true;
}else if(left == nullptr || right == nullptr || left->val != right->val)
{
return false;
}else{
return compare(left->left,right->right)&& compare(left->right,right->left);
}
}
bool isSymmetrical(TreeNode* pRoot) {
if(pRoot == nullptr)
{
return true;
}else{
return compare(pRoot->left,pRoot->right);
}
}
};