101.对称二叉树(简单)

在这里插入图片描述
解题思路:
递归:从根节点开始遍历树,若一个树为空,则该树为对称树,返回True,若这个树不为空,则使用递归判断其是否为对称二叉树。
对称可以考虑为该节点的左子树的左子树和右子树的右子树相同。
若一个二叉树是对称的,那么其子树肯定也是对称的,所以可以使用递归来判断。
设置最后跳出的情况为:1.左右节点都为空;2.左右节点有一个非空;3.左右节点不相等

class Solution:
    def son(self, p, q):
        if not (p or q):
            return True
        if not (p and q):
            return False
        if p.val != q.val:
            return False

        return self.son(p.left, q.right) and self.son(p.right, q.left)

    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        return self.son(root.left, root.right)

迭代:
使用queue队列保存目前比较的左右两个节点,以上图中的[1,2,2,3,4,4,3]树为例,第一步将根节点下的左右节点放入queue队列中,此时queue为[2,2],left为queue[0],right为queue[1],使用动态循环判断树的状态,使得left=queue.pop(0),right = queue.pop(0)(先放左,后放右节点),若左右节点都为空则返回True,若左右节点不相等或者只有一个是空的节点,则返回False,若相等的话则继续遍历,将当前节点的左右节点都添加到queue中,再循环pop判断,直到queue中没有值为止。
注:在往queue队列中放入数据的时候要注意放入数据的顺序。左子树的左节点应该紧跟着右子树的右节点。左子树的右节点紧跟着右子树的左节点。(左右节点要对应)

class Solution(object):
   def isSymmetric(self, root):
      if not root or not (root.left or root.right):#若树为空,或者为单个节点
         return True

      queue = [root.left,root.right]# 用队列保存节点  
      while queue:
         # 从队列中取出两个节点,再比较这两个节点
         left = queue.pop(0)
         right = queue.pop(0)
         # 如果两个节点都为空就继续循环,两者有一个为空就返回false
         if not (left or right):
            continue
         if not (left and right):
            return False
         if left.val!=right.val:
            return False
         # 将左节点的左孩子, 右节点的右孩子放入队列
         queue.append(left.left)
         queue.append(right.right)
         # 将左节点的右孩子,右节点的左孩子放入队列
         queue.append(left.right)
         queue.append(right.left)
      return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值