已解答
中等
相关标签
相关企业
提示
给你一棵二叉树的根 root
,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。
如果两个节点在树中有相同的深度且它们的父节点不同,那么它们互为 堂兄弟 。
请你返回修改值之后,树的根 root
。
注意,一个节点的深度指的是从树根节点到这个节点经过的边数。
示例 1:
输入:root = [5,4,9,1,10,null,7] 输出:[0,0,0,7,7,null,11] 解释:上图展示了初始的二叉树和修改每个节点的值之后的二叉树。 - 值为 5 的节点没有堂兄弟,所以值修改为 0 。 - 值为 4 的节点没有堂兄弟,所以值修改为 0 。 - 值为 9 的节点没有堂兄弟,所以值修改为 0 。 - 值为 1 的节点有一个堂兄弟,值为 7 ,所以值修改为 7 。 - 值为 10 的节点有一个堂兄弟,值为 7 ,所以值修改为 7 。 - 值为 7 的节点有两个堂兄弟,值分别为 1 和 10 ,所以值修改为 11 。
示例 2:
输入:root = [3,1,2] 输出:[0,0,0] 解释:上图展示了初始的二叉树和修改每个节点的值之后的二叉树。 - 值为 3 的节点没有堂兄弟,所以值修改为 0 。 - 值为 1 的节点没有堂兄弟,所以值修改为 0 。 - 值为 2 的节点没有堂兄弟,所以值修改为 0 。
提示:
- 树中节点数目的范围是
[1, 105]
。 1 <= Node.val <= 104
代码如下:
class Solution:
def replaceValueInTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
# 初始化队列,存储节点和该节点及其兄弟节点的值之和
q = [[root, root.val]]
# 当前层的节点值之和
curSum = root.val
while q:
tmp = q
q = []
# 下一层的节点值之和
nexSum = 0
for node, val in tmp:
# 替换当前节点的值
node.val = curSum - val
# print(curSum,val)
# 计算左子节点的值
lKidVal = node.left.val if node.left else 0
# 计算右子节点的值
rKidVal = node.right.val if node.right else 0
# 累加下一层的节点值之和
nexSum += lKidVal + rKidVal
if node.left:
# 将左子节点及其兄弟节点的值之和加入队列
q.append([node.left, lKidVal + rKidVal])
if node.right:
# 将右子节点及其兄弟节点的值之和加入队列
q.append([node.right, lKidVal + rKidVal])
# 更新当前层的节点值之和为下一层的节点值之和
curSum = nexSum
return root
解法二:
class Solution:
def replaceValueInTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return []
result = []
queue = [(root,0)]
cur_sum = 0
while queue:
level_size = len(queue)
next_sum = 0
for _ in range(level_size):
node,val = queue.pop(0)
node.val = cur_sum - val
left_val = node.left.val if node.left else 0
right_val =node.right.val if node.right else 0
next_sum += left_val + right_val
if node.left:
queue.append((node.left,left_val+right_val))
if node.right:
queue.append((node.right,left_val+right_val))
cur_sum = next_sum
return root