【力扣-二叉树-01】在二叉树中分配硬币-力扣 979 题

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

  • 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

给你一个有 n 个结点的二叉树的根结点 root ,其中树中每个结点 node 都对应有 node.val 枚硬币。整棵树上一共有 n 枚硬币。

在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。移动可以是从父结点到子结点,或者从子结点移动到父结点。

返回使每个结点上 只有 一枚硬币所需的 最少 移动次数。

【力扣-二叉树-01】在二叉树中分配硬币-力扣 979 题_第1张图片

输入:root = [3,0,0]
输出:2
解释:一枚硬币从根结点移动到左子结点,一枚硬币从根结点移动到右子结点。

题解:

  • 递归问题
  • 将分配问题分解为硬币和节点的差值问题,不断地遍历
  • 硬币总数为左右节点的硬币数量+当前节点的硬币数据量
  • 节点数量为左右节点的数量+1(1 就是当前节点)
public class E11Leetcode979 {
    int res;

    public int distributeCoins(TreeNode root) {
        dfs(root);
        return res;
    }

    private int[] dfs(TreeNode root) {
        if (root == null) {
            //节点为空,则硬币数和节点数都为0
            return new int[]{0, 0};
        }
        final int[] dfsLeft = dfs(root.left);
        final int[] dfsRight = dfs(root.right);
        final int coins = dfsLeft[0] + dfsRight[0] + root.val;
        final int nodes = dfsLeft[1] + dfsLeft[1] + 1;
        res += Math.abs(coins - nodes);
        return new int[]{coins, nodes};
    }

    public static void main(String[] args) {
        E11Leetcode979 e11Leetcode979 = new E11Leetcode979();
        TreeNode root = new TreeNode(
                new TreeNode(new TreeNode(3), 0, new TreeNode(0))
                , 3
                , new TreeNode(new TreeNode(0), 0, new TreeNode(2))
        );
        System.out.println(e11Leetcode979.distributeCoins(root));
    }
}

觉得有用的话点个赞 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!

如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!

Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!

img

你可能感兴趣的:(s6,算法与数据结构,leetcode,算法,职场和发展)