剑指offer——JZ28 对称的二叉树 解题思路与具体代码【C++】

一、题目描述与要求

对称的二叉树_牛客题霸_牛客网 (nowcoder.com)

题目描述

给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如:                                 下面这棵二叉树是对称的

剑指offer——JZ28 对称的二叉树 解题思路与具体代码【C++】_第1张图片

下面这棵二叉树不对称。

剑指offer——JZ28 对称的二叉树 解题思路与具体代码【C++】_第2张图片

数据范围:节点数满足 0≤n≤1000,节点上的值满足 ∣val∣≤1000

要求:空间复杂度 O(n),时间复杂度O(n)

备注:

你可以用递归和迭代两种方法解决这个问题

示例

示例1:

输入:{1,2,2,3,4,4,3}

返回值:true

示例2:

输入:{8,6,9,5,7,7,5}

返回值:false


二、解题思路

要判断一颗二叉树是否是对称的,也就是判断根结点的左右结点是否相等,然后判断左子树的左节点与右子树的右节点还有左子树的右节点与左子树的左节点是否相等。

因而我们只需要写一个递归函数,对左右子树进行对比,因而参数需要两个结点,第一次直接传递两个根结点,对其进行比较,然后逐层对左右子树进行比较。

首先判断是否为一颗空树/两个结点是否都为空,为空返回true;

如果两个结点只有一个为空或者两个结点的值不相等,那么说明这棵树肯定不对称,返回false;

然后对左右子树的下一层结点继续进行比较,直至访问结束,返回结果。

剑指offer——JZ28 对称的二叉树 解题思路与具体代码【C++】_第3张图片


三、具体代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return bool布尔型
     */
    bool recursion(TreeNode* root1,TreeNode* root2){
        //两个结点都为空或者是一颗空树
        if(root1==nullptr&&root2==nullptr)  return true;
        //只有一个为空或者这两个结点的值不相等 那肯定不对称
        if(root1==nullptr||root2==nullptr||root1->val!=root2->val) return false;
        //判断下一层结点 左子树左节点跟右子树的右节点比较 左子树右节点和右子树左节点比较
        return recursion(root1->left,root2->right)&&recursion(root1->right, root2->left);
    }
    bool isSymmetrical(TreeNode* pRoot) {
        return recursion(pRoot,pRoot);
    }
};

你可能感兴趣的:(剑指offer,算法,c++,数据结构)