LeetCode算法题:使二叉树所有路径值相等的最小代价

本文介绍了如何使用贪心策略解决LeetCode问题,通过计算使二叉树所有路径达到相同值所需的最少增量次数。
摘要由CSDN通过智能技术生成

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;
    }
}

解题思路:

  1. 首先,题意显示,系统传入参数n是满二叉树的节点数目,而整型数组cost存放的是每个结点中的数值。
  2. 前提条件,让根结点到每一个 叶子结点的路径值相等,该程序最后需要返回的是最少需要执行增加操作多少次。
  3. 解题步骤:(贪心算法)
  • 选择一个示例演示

  • 输入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.
在这里插入图片描述

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_WEH_coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值