剑指offer58_对称的二叉树_题解

对称的二叉树

题目描述

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

分析

方案一:递归

对称二叉树定义:对于树中任意两个对称结点 \(L\)\(R\),一定有:

  • \(L.val=R.val:\) 即两对称结点值相等
  • \(L.left.val=R.right.val:\)\(L\) 的左子节点和 \(R\) 的右子节点对称
  • \(L.left.val=R.right.val:\)\(L\) 的左子节点和 \(R\) 的右子节点对称

Picture1.png

设置一个递归函数 \(IsSymmetrical(L, R)\),对称返回 \(true\) ,否则返回 \(false\)

递归终止条件:

如果 \(L\)\(R\) 都为空指针,返回 \(true\);否则如果只有一个为空指针,返回 \(false\)

递归:

判断两结点 \(L->left\)\(R->right\) 是否对称,即 \(IsSymmetrical(L->left, R->right)\)

判断两结点 \(L->right\)\(R->left\) 是否对称,即 \(IsSymmetrical(L->right, R->left)\)

代码

/*
1.时间复杂度:O(n)
2.空间复杂度:O(n)
最坏情况下,二叉树退化为链表
*/
class Solution
{
public:
    bool isSymmetrical(TreeNode *pRoot1, TreeNode *pRoot2)
    {
        if (pRoot1 == NULL && pRoot2 == NULL)
            return true;

        if (pRoot1 == NULL || pRoot2 == NULL)
            return false;

        if (pRoot1->val != pRoot2->val)
            return false;

        return isSymmetrical(pRoot1->left, pRoot2->right) && isSymmetrical(pRoot1->right, pRoot2->left);
    }
    bool isSymmetrical(TreeNode *pRoot)
    {
        return isSymmetrical(pRoot, pRoot);
    }
};
posted @ 2021-02-26 16:02  RiverCold  阅读(73)  评论(0编辑  收藏  举报