Leetcode每日一题2021.2.28第100题:相同的树

题目描述

在这里插入图片描述

示例

在这里插入图片描述
在这里插入图片描述

深度优先搜索

如果两个二叉树都为空,那这两个二叉树相同。如果两个二叉树中有且只有一个而空,则两个二叉树一定不相同。
如果两个二叉树都不为空,那么首先判断它们的根节点是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。

代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    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 False
        else:
            return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

方法二:广度优先搜索

同样首先判断两个二叉树是否为空,如果都不为空,则从两个二叉树地根节点开始广度优先搜索。
使用两个队列分别存储两个二叉树的节点,进行如下比较操作:

  1. 比较两个节点的值,如果两个节点的值不相同,则两个二叉树一定不相同;
  2. 如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,或者只有一个节点的额右子节点为空,则两个二叉树的结构不同,因此两个二叉树一定不同;
  3. 如果两个节点的子节点的结构相同,则将两个节点的非空子节点分别加入两个队列,子节点加入队列时需要注意顺序,如果左右子节点都不为空,则先加入左子节点,后加入右子节点。

如果搜索结束时两个队列同时为空,则两个二叉树相同。如果只有一个队列为空,则两个二叉树的结构不同,因此两个二叉树不同。

代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p and not q:
            return True
        if not p or not q:
            return False

        queue1 = collections.deque([p])
        queue2 = collections.deque([q])

        while queue1 and queue2:
            node1 = queue1.popleft()
            node2 = queue2.popleft()

            if node1.val != node2.val:
                return False
            if (not node1.left) ^ (not node2.left):
                return False
            if (not node1.right) ^ (not node2.right):
                return False
            if node1.left:
                queue1.append(node1.left)
            if node1.right:
                queue1.append(node1.right)
            if node2.left:
                queue2.append(node2.left)
            if node2.right:
                queue2.append(node2.right)

        return not queue1 and not queue2
    

小知识点:collections.deque

collections里与队列相关的唯一一个集合:deque。
deque是双边队列(double-ended queue),具有队列和栈的性质,在list的基础上增加了移动、旋转和增删等。

常用方法
d = collections.deque([])
d.append('a') # 在最右边添加一个元素,此时 d = deque('a')
d.appendleft('b') # 在最左边添加一个元素,此时 d = deque(['b','a'])
d.extend(['c','d']) # 在最右边添加所有元素,此时 d = deque(['b','a','c','d'])
d.extendleft(['e','f']) # 在最左边添加所有元素,此时 d = deque(['f','e','b','a','c','d'])
d.pop() # 将最右边的元素取出,返回'd',此时 d = deque(['f','e','b','a','c'])
d.popleft() # 将最左边的元素取出,返回'f',此时 d = deque(['e','b','a','c'])
d.rotate(-2) # 向左旋转两个位置(正数则向右旋转),此时 d = deque(['a','c','e','b'])
d.count('a') # 队列中'a'的个数,返回1
d.remove('c') # 从队列中将'c'删除,此时 d = deque(['a','e','b'])
d.reverse() # 将队列倒序,此时 d = deque(['b','e','a'])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值