小黑实习干饭开始平衡生活,抽空的leetcode之旅:951. 翻转等价二叉树

小黑代码

# 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 flipEquiv(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool:
        if not (root1 or root2):
            return True

        if not (root1 and root2) or root1.val != root2.val:
            return False
        
        q1 = collections.deque([root1])
        q2 = collections.deque([root2])

        while q1 and q2:
            # 队列的长度
            n = len(q1)
            for _ in range(n):
                # 结点出队
                top1 = q1.popleft()
                top2 = q2.popleft()
                # 提取孩子结点的值
                left1_val = top1.left.val if top1.left else -1
                left2_val = top2.left.val if top2.left else -1
                right1_val = top1.right.val if top1.right else -1
                right2_val = top2.right.val if top2.right else -1
                # 判断是否两个父节点的两个子结点等价
                if not ((left1_val == left2_val and right1_val == right2_val) or (left1_val == right2_val and right1_val == left2_val)):
                    print(left1_val, left2_val, right1_val, right2_val)
                    return False
                # 入队
                if left1_val == left2_val:
                    if top1.left:
                        q1.append(top1.left)
                    if top1.right:
                        q1.append(top1.right)
                    if top2.left:
                        q2.append(top2.left)
                    if top2.right:
                        q2.append(top2.right)
                else:
                    if top1.left:
                        q1.append(top1.left)
                    if top1.right:
                        q1.append(top1.right)
                    if top2.right:
                        q2.append(top2.right)
                    if top2.left:
                        q2.append(top2.left)
        if q1 or q2:
            return False
        return True

在这里插入图片描述

递归法

# 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 flipEquiv(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool:

        if not (root1 or root2):
            return True
        
        if not root1 or not root2 or root1.val != root2.val:
            return False
        # 翻转前后,有一个相等即可
        return (self.flipEquiv(root1.left, root2.left) and self.flipEquiv(root1.right, root2.right)) or (self.flipEquiv(root1.left, root2.right) and self.flipEquiv(root1.right, root2.left))       

在这里插入图片描述

标准态遍历

class Solution:
    def flipEquiv(self, root1, root2):
        def dfs(node):
            if not node:
                yield '#'
                return
            yield node.val
            # 左小右大
            left_num = node.left.val if node.left else 0
            right_num = node.right.val if node.right else 0
            # 接受子树的yield
            if right_num > left_num:
                yield from dfs(node.left)
                yield from dfs(node.right)
            else:
                yield from dfs(node.right)
                yield from dfs(node.left)

        return list(dfs(root1)) == list(dfs(root2))

在这里插入图片描述

小黑生活

感谢hr小姐姐给的水果

在这里插入图片描述

蜜汁鸡晚饭在这里插入图片描述

回去的地铁上也不闲着啦

在这里插入图片描述

以后上班了,压力会更大,也要尽可能充满活力

在这里插入图片描述

钢琴学习,第21课

在这里插入图片描述

早高峰排队出站

在这里插入图片描述

又来大厂感谢信了

在这里插入图片描述

公司新年装饰

在这里插入图片描述

中午破费吃个卤煮,虽然不那么正宗

在这里插入图片描述

午后咖啡刷题

在这里插入图片描述

最近大量销售岗位持续推荐给我,小黑不予理睬,希望前期还是以互联网为主,先把喜欢的事情做好!

在这里插入图片描述

干饭日常

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

准备玩钢琴去啦,润了!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值