题目描述:
给你一棵二叉树的根 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, 10^5]
。1 <= Node.val <= 10`4
思路:
根据定义,堂兄弟出现在同一层节点中,且父节点不同。
因此,首先想到层序遍历,将每一层节点放入同一列表中;
再遍历节点时,在父节点处进行修改,更改子节点的值,判断有无兄弟节点,在列表中求和并删除自身与兄弟节点即可。
代码:
# 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 replaceValueInTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def dfs1(root: Optional[TreeNode], depth: int):
if root is None:
return
if len(s) <= depth:
s.append(0)
s[depth] += root.val
dfs1(root.left, depth + 1)
dfs1(root.right, depth + 1)
def dfs2(root: Optional[TreeNode], depth: int):
sub = (root.left.val if root.left else 0) + (
root.right.val if root.right else 0
)
depth += 1
if root.left:
root.left.val = s[depth] - sub
dfs2(root.left, depth)
if root.right:
root.right.val = s[depth] - sub
dfs2(root.right, depth)
s = []
dfs1(root, 0)
root.val = 0
dfs2(root, 0)
return root