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

    小结

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

  • 相关阅读:
    三、oracle 体系结构
    js字符串转化为日期及日期判断大小
    二十五、oracle pl/sql进阶控制结构(分支,循环,控制)
    五、oracle 10g目录结构
    二十六、oracle pl/sql 分页
    Oracle物化视图语法
    二、理解over()函数
    Java使用SOAP获取webservice实例解析
    常用的PL/SQL开发原则
    二十九、oracle 触发器
  • 原文地址:https://www.cnblogs.com/young233/p/14079228.html
Copyright © 2011-2022 走看看