这里有一个关于如何做到这一点的想法(您可能需要修改和添加一些东西才能使其正常工作)-
如链接中所述,我们将使用一个二维数组(例如 dp)来存储我们的部分答案并使用它们来找到所需的答案。其次,dp[v][k] 表示对于(子树或主树的)根节点v,我们恰好需要k 个叶节点。
基本案例 -
对于任何叶节点 lv-
//Case 1 - only one leaf is required so we dont need to delete any node
dp[lv][1] = 0
//Case 2 - more than 1 leaf node required which is not possible
dp[lv][k] = INT_MAX
对于任何节点 v -
//As no leaf is required we delete all nodes
dp[v][0] = sum of weights of all nodes in subtree with v(including weight of v)
DP-的机制-
现在假设我们现在在一个节点 v 上,我们需要在这个节点的子树中有 k 个叶子。让我们先写它的代码,然后我会解释它是如何工作的。
for(int i=0;i<=k;i++)
dp[v][k] = min( dp[v][k], dp[left-child][i] + dp[right-child][k-i];
这里left-child和right-child是v的左右节点。
对于每个叶节点,有两件事是可能的,即它可以在左子树或右子树中。所以,我正在遍历所有这些状态,从不包含叶节点的左子树到包含所有叶节点的左子树,右子树也是如此。最后,将迭代中找到的最小值存储在dp[v][k]中。