对称二叉树-python

leetCode第101题 对称二叉树
链接:https://leetcode-cn.com/problems/symmetric-tree

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

在这里插入图片描述
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

在这里插入图片描述
输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

看二叉树是不是二叉树就是比较对称位置上的结点的值是不是相等,问题的关键是怎么挑选出这两个结点刚好是在对称位置上。
从示例1的图似乎能找到些什么。
如果二叉树是对称的话那么左节点的左孩子等于右结点的右孩子
左结点的右孩子等于右结点的左孩子
在这里插入图片描述
那么完全可以通过递归的方式自顶向下进行比较
构造递归函数,作用:比较左结点的右孩子是否等于右结点的左孩子以及左节点的左孩子是否等于右结点的右孩子
明确退出递归的条件:当已经到了树的最底层,返回真
当有一边结点已经为空,另外一边却不为空,肯定不对称,返回假
当两个结点的值不相等,返回假
否则,调用自身,继续比较

## python3
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if root == None:
            return True
        return self.deepcheck(root.left,root.right)

    def deepcheck(self,left: TreeNode,right: TreeNode) ->bool:
        if left == None and right == None:  # 终止条件,遍历到了最深的结点
            return True
        if left == None or right == None:  # 有一边为了空,另一半却不为空,肯定不对称
            return False
        if left.val != right.val:  ## 值不相等
            return False
        ## 调用自身,递归地比较左结点的左孩子和右结点地的孩子
        ## 以及比较左节点的右孩子和右节点的左孩子
        return self.deepcheck(left.left,right.right) and self.deepcheck(left.right,right.left)

用循环迭代的方式实现
需要借助队列这种数据结构
同样看示例1
在这里插入图片描述
当root为空或只有root一个结点时,返回真
否则直接入队
在这里插入图片描述
然后进入循环,成双的出队
将出队的元素比较值的大小,不相等直接返回假,否则,将结点的左孩子和后结点的右孩子入队,再将前结点的右孩子和后结点的左孩子入队
进入下一循环,直到队列为空
在这里插入图片描述

## python3
class Solution1:
    def isSymmetric(self, root: TreeNode) -> bool:
        q = []
        u = root.left
        v = root.right
        if root == None or (u == None and v == None):
            return True
        q.append(u)
        q.append(v)
        while len(q) != 0:
            u = q.pop(0)
            v = q.pop(0)
            if u == None and v == None :
                continue
            if (u == None or v == None) or u.val != v.val: #进一步判断是否只有一边有结点,或两个结点值不一样
                return False
            q.append(u.left)
            q.append(v.right)
            
            q.append(u.right)
            q.append(v.left)
        return True
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

unseven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值