力扣刷题Python笔记:对称二叉树

题目

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

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
力扣刷题Python笔记:对称二叉树_第1张图片
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
力扣刷题Python笔记:对称二叉树_第2张图片
进阶:

你可以运用递归和迭代两种方法解决这个问题吗?

来源:力扣(LeetCode)

Python解法

又是一道二叉树的题,感觉这种题就是一看题解就会,一自己做就废~
以下思路和代码均来自力扣题解。

递归解法

镜像对称,就是指左右两边对称相等,即左子树和右子树是相当的,因此我们要递归地比较左子树和右子树。

具体的解题思路如下:
①我们将根节点的左子树记做 left,右子树记做 right。比较 left 是否等于 right,不相等的话直接返回 False;
②如果相等,比较 left 的左节点和 right 的右节点,再比较 left 的右节点和 right 的左节点,即递归地比较 left.left 和 right.right,left.right 和 right.left;
③当 left 和 right 不等,或者 left 和 right 都为空时,停止递归。

代码如下:

def isSymmetric(self, root: TreeNode) -> bool:
    if not root:
        return True
    def dfs(left,right):
        # 递归的终止条件是两个节点都为空
        # 或者两个节点中有一个为空
        # 或者两个节点的值不相等
        if not (left or right):
            return True
        if not (left and right):
            return False
        if left.val != right.val:
            return False
        return dfs(left.left,right.right) and dfs(left.right,right.left)
    # 用递归函数,比较左节点,右节点
    return dfs(root.left,root.right)

迭代解法

具体的解题思路如下:
①从队列中拿出两个节点( left 和 right )比较:将 left 的 left 节点和 right 的 right 节点放入队列,将 left 的 right 节点和 right 的 left 节点放入队列
时间复杂度是 O(n)O(n),空间复杂度是 O(n)O(n)
动画演示如下:

代码如下:

def isSymmetric(self, root: TreeNode) -> bool:
    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

你可能感兴趣的:(力扣python刷题,算法)