LeetCode题目(Python实现):相同的树

文章目录

  • 题目
    • 想法一:递归
      • 算法实现
      • 执行结果
      • 复杂度分析
    • 迭代
      • 算法实现
      • 执行结果
    • 小结

题目

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例1 :

输入:       1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

输出: true

示例2 :

输入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

输出: false

示例3 :

输入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

输出: false

想法一:递归

算法实现

def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
    if not p and not q:
        return True
    elif not p or not q:
        return False
    elif p.val == q.val:
        return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
    else:
        return False

执行结果

执行结果 : 通过
执行用时 : 40 ms, 在所有 Python3 提交中击败了35.99%的用户
内存消耗 : 13.7 MB, 在所有 Python3 提交中击败了5.08%的用户
LeetCode题目(Python实现):相同的树_第1张图片

复杂度分析

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

迭代

算法实现

from collections import deque
def isSameTree(self, p, q):
    """
    :type p: TreeNode
    :type q: TreeNode
    :rtype: bool
    """

    def check(p, q):
        # if both are None
        if not p and not q:
            return True
        # one of p and q is None
        if not q or not p:
            return False
        if p.val != q.val:
            return False
        return True

    deq = deque([(p, q), ])
    while deq:
        p, q = deq.popleft()
        if not check(p, q):
            return False

        if p:
            deq.append((p.left, q.left))
            deq.append((p.right, q.right))

    return True

执行结果

LeetCode题目(Python实现):相同的树_第2张图片

小结

一遇到树首先想到的是用递归,可能是之前做题被训练出来了吧,然后看了题解关于树的讲解,感觉非常好,对树更加熟悉了,之前对递归的惧怕少了很多。

找到一篇写二叉树的题解思路很好的文章,以后没准会用到。

关于迭代用到的队列这种想法也学到了,看来遍历树不止迭代一种方法。

你可能感兴趣的:(LeetCode题目)