通过移除其中一条树,可以将树拆分为两个不同的树。给定N
个节点由[0, N-1]
范围内的整数唯一标识的树,我需要编写一个函数来查找需要从树中删除的边,这样才能得到总和之间的差异结果树中所有节点ID的最小化。
该函数应该打印它在标准输出(stdout)中找到的最小差异。
该函数将收到以下参数:
parent
这是一个整数数组,其含义如下:parent[i]
=节点i
的父节点(更具体地说是其ID)
parent[i] = -1
如果我没有父母(我是树的根)
数据限制
树中的最大节点数为50,000
效率限制
该功能可以在不到2秒的时间内打印出结果
示例
Input parent: [1, 4, 4, 2, -1, 2, 2]
aka : 4
/ \
1 2
/ / | \
0 3 5 6
Output: 9
说明:我们删除了节点2和6之间的边缘。
答案 0 :(得分:2)
对于每个节点,计算其子节点的总和,然后将此值添加到自身,并将其存储在节点中。我们将此值S_n
称为n
,其中n
是一个节点。 (可以通过递归和后序遍历轻松完成)
找到S_n
与S_root/2
最小差异的节点{{1}}。 n与其父级之间的边缘是我们想要的边缘。 (在最坏的情况下,这需要线性时间。)