剑指offer——对称的二叉树

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

前面做过一道题目—— 二叉树的镜像。根据提示,可以求出左子树的镜像,然后看是否等于右子树,如果相等,则二叉树是对称的。

为了不改变二叉树,定义节点指针 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);
    }
};

猜你喜欢

转载自blog.csdn.net/Eartha1995/article/details/81566588