Python计算子树节点值之和的最小值程序
假设我们有一棵树,所有节点都编号为1到n。每个节点包含一个整数值。现在如果我们从树中移除一条边,那么两个子树节点值之和的差异必须最小。我们必须找出并返回这种子树之间的最小差异。树以边的形式给出,节点的值也提供了。
因此,如果输入是n = 6,edge_list = [[1,2],[1,3],[2,4],[3,5],[3,6]],values = [15,25,15,55,15,65],则输出将为0。
如果移除边(1,2),权重总和变为80,110。差值为30。
如果移除边(1,3),权重总和变为95,95。差值为0。
如果移除边(2,4),权重总和变为55,135。差值为80。
如果移除边(3,5),权重总和变为15,175。差值为160。
如果移除边(3,6),权重总和变为65,125。差值为60。
因此,最小权重为0。
为了解决此问题,我们将执行以下步骤:
- adj_list父节点:一个新列表,大小为n,包含空列表
- 对于edge_list中的每个边,执行以下操作:
- u = edge[0]
- v = edge[1]
- 将v-1插入adj_list [u-1]末尾
- 将u-1插入adj_list [v-1]末尾
- value_list:一个初始化为0的大小为n的新列表
- not_visited:大小为i的新地图,其中i是adj_list中非空列表的数量
- while not_visited不为空,执行以下操作:
- for循环中的i in not_visited,执行以下操作:
- value_list [i] = value_list [i] + values [i]
- 如果 (adj_list [i] ) 的长度非零,则删除i的邻接列表[adj_list [i,在0]中的 i ]
- value_list [adj_list [i,在0]] = value_list [adj_list [i,在0]] + value_list [i]
- for i in not_visited中的每个i,执行以下操作:
- 如果len(adj_list [i])和 len(adj_list [adj_list [i,在0]]) 1,则
- not_visited =包含adj_list [i,在0]的新列表
- for循环中的i in not_visited,执行以下操作:
- return_val:|sum(values)-2*value_list [0] |的值
- 对于i在范围1到n的循环,执行以下操作:
- decision_val:|sum(values)-2*value_list [i] |的值
- 如果decision_val
- return_val:=decision_val
-
return return_val
示例
看下面的实现以更好地理解此示例−