小黑代码
# 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课
早高峰排队出站
又来大厂感谢信了
公司新年装饰
中午破费吃个卤煮,虽然不那么正宗
午后咖啡刷题
最近大量销售岗位持续推荐给我,小黑不予理睬,希望前期还是以互联网为主,先把喜欢的事情做好!
干饭日常