2023-07-11 力扣2673 使二叉树所有路径值相等的代价

https://leetcode.cn/problems/make-costs-of-paths-equal-in-a-binary-tree/

贪心

1

考虑到根到两个互为兄弟节点的叶子的两条路径
由于这两条路径除了叶子节点不一样,其余节点都一样,所以为了让这两条路径的路径和相等,必须修改叶子节点的值。
设叶子节点的值分别为x和y,假设x\leqy,是否需要同时增加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;
}


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容