思路:
首先分析题意结合例子可得出两个关键点:
# 同一根下的叶子节点的值要相同,例如例 1 的 4 和 5 号节点
# 同一父节点的左右分支路径值一定要相等
我的想法是使用贪心+后序遍历,先统一左分支的叶子节点的值,获取左分支路径值 left 。再统一右分支的叶子节点值,获取右分支路径值 right ,两者差值 Math.abs(left - right) 即是我们所求的执行增加操作 。具体流程如下:
- 返回左节点的路径值,回溯到父节点时得到左分支路径值 left 。
- 相同原理进行右分支遍历,得到 right 的路径值。
- 左右路径值进行统一,用成员变量 num 记录累加执行增加操作 Math.abs(left - right)
复杂度分析:
- 时间复杂度:O( n ),其中 n 为 cost 长度
- 空间复杂度:O( 1 ),仅用到 num 成员变量
思考题
如果可以对节点值减一要怎么做?
class Solution {
public int minIncrements(int n, int[] cost) {
add(1,cost);
return num;
}
int num=0;
int add(int i, int[] cost){
if(i > cost.length/2){
return cost[i-1];
}else{
var left = add(2*i,cost);
var right = add(2*i+1,cost);
num += Math.abs(left - right);
return Math.max(left,right)+cost[i-1];
}
}
}