剑指offer(C++)-JZ28:对称的二叉树(数据结构-树)

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer(C++)-JZ28:对称的二叉树(数据结构-树)相关的知识,希望对你有一定的参考价值。

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

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

下面这棵二叉树不对称。
数据范围:节点数满足0≤n≤1000,节点上的值满足∣val∣≤1000

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

备注:

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

 

示例:

输入:

1,2,2,3,4,4,3

返回值:

true

解题思路:

本题考察数据结构树的使用。当根节点为空时,对称;比较左子树和右子树,若左子树存在右子树不存在,则不对称;若左子树不存在右子树存在,则不对称;若左右子树均不存在,则对称;若左子树根值不等于右子树根植,则不对称;递归,继续将左子树的左子树和右子树的右子树比较,将左子树的右子树和右子树的左子树比较。完毕。

测试代码:

/*
struct TreeNode 
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) 
    
;
*/
class Solution 
public:
    // 判断对称
    bool isSymmetrical(TreeNode* pRoot) 
        if(!pRoot)
            return true;
        // 根节点的左右子树进行比较
        return Compare(pRoot->left,pRoot->right);
    
    
    // 比较函数
    bool Compare(TreeNode* left,TreeNode* right)
        // 若左子树存在右子树不存在,则不对称;若左子树不存在右子树存在,则不对称
        if((!left&&right)||(left&&!right))
            return false;
        // 若左右子树均不存在,则对称
        if(!left&&!right)
            return true;
        // 若左子树根值不等于右子树根植,则不对称
        if(left->val!=right->val)
            return false;
        // 递归:将左子树的左子树和右子树的右子树比较,将左子树的右子树和右子树的左子树比较
        return Compare(left->left,right->right)&&Compare(left->right,right->left);
    

;

以上是关于剑指offer(C++)-JZ28:对称的二叉树(数据结构-树)的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer:对称的二叉树28

剑指offer--28对称的二叉树

剑指 Offer 28. 对称的二叉树

剑指offer面试题 28. 对称的二叉树

剑指Offer打卡28.对称的二叉树

剑指Offer打卡28.对称的二叉树