对称的二叉树

题目描述

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

输入输出示例

示例1
输入:{8,6,6,5,7,7,5}
返回值:true
示例2
输入:{8,6,9,5,7,7,5}
返回值:false

解题思路

二叉树的每个节点的左右子树都是一个镜像文件,即此二叉树就是对称二叉树(只有根节点或者树为空的情况也都为对称二叉树)。

  • 定义判断是否是镜像的函数,传入参数为左子树和右子树,用于判断每次左右子树是否是镜像的:
    此函数中,
  1. 如果左节点和右节点都为空,表示没有左右子树,是对称二叉树,返回True;
  2. 如果左节点或者右节点一个为空,表示左右子树只存在一个,那一定不是对称二叉树返回False;
  3. 其他情况,就是同时存在左右子树,一种是存在但左右节点的值不相等,不是对称二叉树;另一种是存在且左右节点的值相等,则继续递归比较左右子树下的左右子节点是否满足镜像(左子树的左节点等于右子树的右节点,左子树的右节点等于右子树的左节点),如果同时满足,则说明该二叉树是对称二叉树,返回True,有任意一个是False都返回False
  • 考虑边界条件,即树为空的情况,属于对称二叉树直接返回True,
  • 否则,树不为空的情况下,判断当前根节点的左子树与右子树是否满足呈镜像二叉树

代码示例

# coding:utf-8


class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def isSymmerical(self, pRoot):
        # 定义一个函数,用于判断左右节点是否构成镜像二叉树
        # 根节点的左右节点相等,左节点的左节点等于右节点的右节点;左节点的右节点等于右节点的左节点
        def isMirror(left, right):
            # 如果左节点和右节点都为空,则是对称二叉树
            if left == None and right == None:
                return True
            # 如果有一个节点为空,一个节点不为空,则不是对称的
            elif left == None or right == None:
                return False
            # 存在左右节点,
            else:
	            # 但左节点的值与右节点的值不相等,不是对称的
	            if left.val != right.val:
	                return False
	            # 存在且左右节点的值相等
	            # 继续递归判断左节点的子节点与右节点的子节点是否构成镜像
	            # 左节点的左子节点是否等于右节点的右子节点
	            ret1 = isMirror(left.left, right.right)
	            # 左节点的右子节点是否等于右节点的左子节点
	            ret2 = isMirror(left.right, right.left)
	            #返回两个结果的与结果 必须两个都满足才是对称的,返回True
	            return ret1 and ret2

        # 边界条件:如果树为空,是对称的,返回True
        if pRoot == None:
            return True
        # 否则递归比较根节点的左子树和根节点的右子树
        return isMirror(pRoot.left, pRoot.right)

if __name__ == '__main__':
    # 8, 6, 6, 5, 7, 7, 5
    node1 =TreeNode(8)
    node2 =TreeNode(6)
    node3 =TreeNode(6)
    node4 =TreeNode(5)
    node5 =TreeNode(7)
    node6 =TreeNode(7)
    node7 =TreeNode(5)
    node1.left = node2
    node1.right = node3
    node2.left = node4
    node2.right = node5
    node3.left = node6
    node3.right = node7
    s = Solution()
    res = s.isSymmerical(node1)
    print(res)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值