101. 对称二叉树

 

题目

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

假设这棵树张这个样子:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

分析

按照解答二叉树问题的惯例,我们给出两种解答(递归和非递归)。

首先,判断一棵二叉树是否对称的条件可以分为以下几种:
1. 根节点无左子树和右子树,此时一定是对称的,返回True。
2. 根节点有左子树或者右子树,但是只有一边,此时一定不对称,返回False。
3. 根节点两边子树都有,此时左子树的左节点等于右字数的右节点,右子树的左节点等于左节点的右节点,同时满足三个条件才可以返回True。

 

递归方案

按照常规的思维方式,我们先给出递归的解决方案:


class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        return self.isMirror(root,root)  
    
    def isMirror(self, node1: TreeNode, node2: TreeNode) -> bool:
        if not node1 and not node2: return True  #条件1
        if not node1 or not node2: return False  #条件2
        return node1.val == node2.val and self.isMirror(node1.left, node2.right) and self.isMirror(node1.right, node2.left) #条件3,递归判断

时间复杂度:O(n)
空间复杂度:O(n)
实际运行结果:

 

非递归方案

而非递归方案则使用了遍历的方法,将二叉树中的元素放在同个数组里,然后通过循环数组来判断它是不是对称数组。

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        queue = [root]
        while queue:
            values = [i.val if i else None for i in queue]
            if values != values[::-1]: return False
            queue = [child for i in queue if i for child in (i.left, i.right)]
        return True

时间复杂度:O(n)
空间复杂度:O(n)
实际运行结果:

小结

可以看出,两种方法消耗的资源差距并不大,但是递归的方法更加好理解一些。而遍历这种非遍历的方法并不是此题的最优解。
但是我还是列出来吧,毕竟按照惯例,递归和非递归两种方法都要有的。

posted on 2020-12-03 15:00  eryoung2  阅读(41)  评论(0编辑  收藏  举报