LeetCode 算法题库【101】——对称二叉树

对称二叉树

题目描述:

timu

解题思路:
  • 第一种:递归方法。这道题应该说比较容易想到的就是递归的方法,为了方便比较判断,我新定义了一个函数CompareTree,我们将在这个函数里判断这个树是否为对称二叉树,首先我们将树的头节点的两个根节点放入比较,如果满足了对称的条件,就依次将这两个根节点的下两个根节点放入递归函数中继续判断,只有全部通过,也就是最后的两个节点都为Null,才会返回True
  • 时间复杂度:O(N)
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def CompareTree(self, l, r):
        if not l and not r:
            return True
        elif l and r:
            if l.val == r.val:
                return self.CompareTree(l.left, r.right) and self.CompareTree(l.right, r.left)
            else:
                return False
        else:
            return False
            
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        return self.CompareTree(root.left, root.right)

1

  • 第二种:迭代方法。我们很容易发现这个对称二叉树的每一层都是对称的,即可以看作是回文数组,所以我们利用这个性质,来解这道题。主要思路就是层序遍历和判断每一层的节点的值所构成的数组是否是回文数组。我们先是定义一个列表p来保存当前这一层的所有节点的值,然后再定义一个列表next_Tree来保存下一层的所有节点的值,后面的循环会把当前层和下一层的相应元素append到对应的列表中,然后我们通过判断pp[::-1]是否相同,也就是顺序和反序的列表p,来验证是否满足回文性质,如果不满足,则返回False,如果满足,则继续迭代,每次判断完一层元素都需要清空这两个列表,然后再放入下一层的元素,以此类推,直到所有的层都被验证完成,才会返回True
  • 时间复杂度:O(N^2)
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        Tree = [root]
        while Tree:
            p = [] # 需要一个列表保存当前遍历层节点的值
            next_Tree = [] # 需要一个列表保存当前层下一层的节点
            for point in Tree:
                if not point:
                    p.append(None)
                    continue
                p.append(point.val)
                next_Tree.append(point.left)
                next_Tree.append(point.right)
            if p != p[::-1]:
                return False
            Tree = next_Tree
        return True

2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值