LeetCode算法题:使二叉树所有路径值相等的最小代价
代码展示:
class Solution {
public int minIncrements(int n, int[] cost) {
int res = 0, i = n/2; //res是增加操作次数,i是数组下标
while(i>0){ //判断根节点
res += Math.abs(cost[2*i-1] - cost[2*i]); //找出兄弟结点中的最大值
cost[i-1] += Math.max(cost[2*i-1],cost[2*i]); //上一结点到叶子结点的距离
i--;
}
return res;
}
}
解题思路:
- 首先,题意显示,系统传入参数n是满二叉树的节点数目,而整型数组cost存放的是每个结点中的数值。
- 前提条件,让
根结点
到每一个 叶子结点的路径值相等,该程序最后需要返回的是最少
需要执行增加操作多少次。 - 解题步骤:(贪心算法)
-
选择一个示例演示
-
输入n=7,数组cost分别存放了1、5、2、2、3、3、1.
-
自底向上来判断,先从叶子结点中数值的比较。
比较第6个结点的数值和第7个结点的数值,得出3大于1,得到Math.max(3,1)数值为3
,
其中,这两个结点数值相差2
,则将第7个结点的数值需增加2次
。
将得到的Math.max(3,1)的数值3与上一级父结点的数值相加后的结果就是该父结点(第3个结点)到该结点的每一个子结点的距离都为(2+3=5)。
操作后的数据演示:
同理 -
比较第4个结点的数值和第5个结点的数值,得到Math.max(2,3)数值为
3
,
其中,这两个结点数值相差1
,则将第4个结点的数值需增加1次
。
将得到的Math.max(2,3)的数值3与上一级父结点的数值相加后的结果就是该父结点(第2个结点)到该结点的每一个子结点的距离都为(5+3=8)。
-
比较第2个结点的数值和第3个结点的数值,得到Math.max(5,2)数值为
5
,
其中,这两个结点数值相差3
,则将第3个结点的数值需增加3次
。
将得到的Math.max(5,2)的数值5与上一级父结点的数值相加后的结果就是该父结点(根结点)到该结点的每一个子结点的距离都为(1+5=6)。
-
当执行最后一个节点(根节点)时,程序执行完。
综上,总共增加次数为 2 + 1 + 3 = 6次,
根到每一个叶子结点的距离都为9.