https://leetcode.cn/problems/make-costs-of-paths-equal-in-a-binary-tree/
贪心
1
考虑到根到两个互为兄弟节点的叶子的两条路径
由于这两条路径除了叶子节点不一样,其余节点都一样,所以为了让这两条路径的路径和相等,必须修改叶子节点的值。
设叶子节点的值分别为x和y,假设xy,是否需要同时增加x和y呢?
这是不需要的,把x增加y-x就行,因为我们可以增加它们的祖先节点的值,使得它们俩的路径和与其他的路径和相等,这样可以节省操作次数。
2
对于不是叶子的兄弟节点,又要如何比较和计算呢?
和上面的分析一样,从根到当前节点的路径,除了这两个兄弟节点不一样,其余节点都一样。所以把路径和从叶子往上传,这样就可以按照提示1那样比较了。
示例1如下图,节点2的路径和视作x+5+3=x+8,节点3的路径和视作x+2+3=x+5(x是上面的路径和),这样可知把节点3的值增加(x+8)-(x+5)= 8 - 5 = 3.
代码实现时,可以直接在cost上累加路径和。由于cost的下标是从0开始的,所以代码中的节点编号转成cost下标,都需要减一。
class Solution{
public:
int minIncrements(int n, vector<int>& cost) {
int ans = 0;
for (int i = n/2; i > 0; i--){ // 从最后一个非叶节点开始算
ans += abs(cost[i*2-1]-cost[i*2]); // 两个子节点变成一样的
cost[i-1] += max(cost[i*2-1], cost[i*2]); // 累加路径和
}
return ans;
}