【每日算法打卡】101. 对称二叉树

简介: 【每日算法打卡】101. 对称二叉树

image.png

题目描述


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

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

1
   / \
  2   2
 / \ / \
3  4 4  3
复制代码

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

1
   / \
  2   2
   \   \
   3    3
复制代码

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


解题思路


递归

对称树实际上就是左子树与右子树镜像对称,那么就可以指定两个指针 l, r 同时反方向移动来遍历这棵树,两个指针开始时都指向根结点,随后 l 右移时,r 左移,l 左移时,r 右移。每次检查当前 lr 节点的值是否相等,左右子树是否对称。

image.png


def isSymmetric(self, root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    def search(l, r):
        if not l and not r:
            return True
        if not l or not r:
            return False
        return l.val == r.val and search(l.left, r.right) and search(l.right, r.left)
    return search(root, root)
复制代码
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)


迭代

引入队列是递归-->迭代转换的常用方法。

初始化时我们把根节点 root 入队两次。

每次提取两个结点 p, q 并比较它们的值是否相等(队列中每两个连续的结点应该是相等的),然后将 p, q 结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者从队列中取出的连续结点 p, q 不相等时(树不对称),该算法结束。


def isSymmetric(root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    if root is None:
        return False
    queue = [root, root]
    while queue:
        p = queue.pop()
        q = queue.pop()
        if not p and not q:
            continue
        if not p or not q or p.val != q.val:
            return False
        queue.append(p.left)
        queue.append(q.right)
        queue.append(p.right)
        queue.append(q.left)
    return True
复制代码
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)


今日打卡完成,目前进度 10/200。



相关文章
|
6月前
|
Java C++ Python
leetcode-101:对称二叉树
leetcode-101:对称二叉树
45 0
Leetcode101.对称二叉树
Leetcode101.对称二叉树
28 0
|
1月前
【LeetCode 30】101.对称二叉树
【LeetCode 30】101.对称二叉树
11 1
|
6月前
LeetCode——101——对称二叉树
LeetCode——101——对称二叉树
63 12
LeetCode | 101. 对称二叉树
LeetCode | 101. 对称二叉树
|
6月前
leetcode:对称二叉树
leetcode:对称二叉树
剑指offer 27. 对称的二叉树
剑指offer 27. 对称的二叉树
71 0
|
Java C++ Python
对称的二叉树(剑指offer 28)
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
对称的二叉树(剑指offer 28)
|
算法 Java
算法打卡Day19_leetcode _101. 对称二叉树
算法打卡Day19_leetcode _101. 对称二叉树
算法打卡Day19_leetcode _101. 对称二叉树
下一篇
无影云桌面