剑指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

扫描二维码关注公众号,回复: 13802350 查看本文章

解题思路:

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

测试代码:

/*
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);
    }

};

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/124232554