zoukankan      html  css  js  c++  java
  • 力扣 2020.12.03

    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)
    实际运行结果:

    小结

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

  • 相关阅读:
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    asp.net session对象的持久化
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    小白也能看懂的约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/young233/p/14079228.html
Copyright © 2011-2022 走看看