979. 在二叉树中分配硬币(力扣)

在二叉树中分配硬币

  • 题目
  • 一题一解:DFS(java)
  • 思路
  • 步骤解析
    • 测试代码
    • 复杂度分析
    • 运行结果
  • 优化代码
    • 思路
    • 测试代码
    • 运行结果
    • 复杂度分析

题目

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

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

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

示例 1:
在这里插入图片描述

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

树中节点的数目为 n
1 <= n <= 100
0 <= Node.val <= n
所有 Node.val 的值之和是 n

一题一解:DFS(java)

思路

我们要寻找每个节点判断是否,有多余的或者不足的硬币,如果有此时我们应该给答案加上差值,因为不足和多余都是要移动硬币的情况,所以对于答案来说,视为一种情况,都为加在答案ans上。
image.png

步骤解析

我们从根节点开始遍历,如上图所示,
值为3的父节点因为没有左节点所以,左节点返回的数组是int []{0,0};

当我们遍历到右节点值为3的时候,在往下遍历时候,值为3的节点是没有左右节点的所以,值为3节点返回的数组int[]{coins,nodes}是int[]{3,1} 那么答案经过计算ans+=Math.abs(coins-nodes);值就为2。

那么值为3的父节点,返回的数组是以它所形成子树的硬币数和节点数总值 ,
int[]{3,2} ,那么答案经过计算,值就为3

其实叶子节点也就看作了是子树,只是特殊的子树,返回的还是以叶子节点所形成的子树总的硬币数和节点数。

那么返回给它的父节点也就是返回给值为1的节点,它左节点返回的是int[]{3,2},当遍历它右节点的时候,因为右节点是叶子节点且没有值,所以它所形成的子树总的硬币coins=0,节点node=1,返回数组为int[]{0,1},那么答案经过计算,值就为4。
所以根节点的左节点形成的子树返回的是int[]{3,2},右节点形成的子树返回的是int[]{0,1},根节点计算之后,coins=3,nodes=3,答案ans不用变化。所以结果是4

测试代码


class Solution{private  int ans=0;public int distributeCoins(TreeNode root) {dfs(root);return ans;}private int[]  dfs(TreeNode treeNode){//当走到叶子节点的时候左右节点所形成的子树没有值if (treeNode==null)return new int[]{0,0};//遍历当前节点的左节点,返回当前左节点所形成的子树的硬币数和节点数int[] left=dfs(treeNode.left);//遍历当前节点的右节点,返回当前右节点所形成的子树的硬币数和节点数int[] right=dfs(treeNode.right);//计算当前节点的总硬币数int coins=left[0]+right[0]+treeNode.val;//计算当前节点的总节点数int nodes=left[1]+right[1]+1;//计算当前节点要移动多少个硬币给父节点或者从父节点拿入硬币ans+=Math.abs(coins-nodes);return new int[]{coins,nodes};}
}

复杂度分析

时间复杂度:O(n),n为二叉树的节点个数。
空间复杂度:O(h)。h为二叉树的高度。

运行结果

image.png

优化代码

思路

在函数dfs(node)中,我们首先遍历左右子树,获得左右子树的是有多余的还不足的硬币数量left和right。那么答案ans需要加上|left| + |right|表示左右子树硬币移动的次数,也就是说左右子树中的金币移动到他们的父节点次数。然后,返回当前节点也就是左右子树的父节点所形成的整个子树的硬币是多余的量还是不足的量,也就是加上左右子树的多余的量还是不足的量再加上当前节点硬币的数量减去减去自己一个节点数。left +right+node.val - 1。直到根节点。

测试代码

class Solution{private  int ans=0;public int distributeCoins(TreeNode root) {dfs(root);return ans;}private int dfs(TreeNode treeNode){if (treeNode==null)return 0;int left=dfs(treeNode.left);int right=dfs(treeNode.right);ans+=Math.abs(left)+Math.abs(right);return left+right+treeNode.val-1;}
}

运行结果

image.png

复杂度分析

时间复杂度:O(n),n为二叉树的节点个数。
空间复杂度:O(h)。h为二叉树的高度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/23108.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【阅读笔记】Rapid, Detail-Preserving Image Downscaling

Rapid, Detail-Preserving Image Downscaling&#xff08;快速的图像缩放技术&#xff09; 该论文提出了一种基于卷积滤波器的算法&#xff0c;并确定滤波器的权值&#xff0c;使重要的细节保留在缩小比例的图像。更具体地说&#xff0c;它为更偏离局部图像邻域的像素分配更大…

IEEE WCCI-2020电动汽车路由问题进化计算竞赛的基准集

引言 交通一直是二氧化碳排放的主要贡献者。由于全球变暖、污染和气候变化&#xff0c;联邦快递、UPS、DHL和TNT等物流公司对环境变得更加敏感&#xff0c;他们正在投资于减少作为其日常运作的一部分而产生的二氧化碳排放的方法。毫无疑问&#xff0c;使用电动汽车&#xff08;…

X86架构的Linux(Ubuntu版本)上离线安装CUnit来解决Could not find CUnit(missing:CUNIT_LIBRARY)问题

前言1 下载cunit压缩安装包&#xff1a;CUint-2.1-3.tar.bz2&#xff08;为了安装成功请下载对应版本&#xff09;2 解压安装压缩包3 sudo ./bootstrap --prefix/usr/local/cunit 生成可执行文件configure*4 sudo ./configure --prefix/usr/local/cunit5 sudo make . 编译 &…

记录--你知道Vue中的Scoped css原理么?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 追忆Scoped 偶然想起了一次面试&#xff0c;二面整体都聊完了&#xff0c;该做的算法题都做出来了&#xff0c;该背的八股文也背的差不多了&#xff0c;面试官频频点头&#xff0c;似乎对我的基础和项…

常见的bug---4、在DataGrip上跑本地模式报return 2异常

文章目录 问题描述原因分析&#xff1a;解决方案&#xff1a; 问题描述 FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask 在DataGrip上设置了Hive的本地模式。虽然可以建表、但是无法对表进行插入数据 原因分析&#xff1a; 在插…

概率论的学习和整理15: 超几何分布,二项分布,泊松分布是如何趋近收敛的?

目录 1 问题&#xff1a; 2 结论 3 实验1 4 实验2 5 实验3 6 实验4 5 各种规律总结 5.1 1 5.2 2 5.3 3 5.4 4 6 超几何分布&#xff0c;二项分布&#xff0c;泊松分布&#xff0c;三者用EXCEL模拟 6.1 简单的扩展到泊松分布 6.2 比较整体的动态过程&…

【Linux】Linux下的项目自动化构建工具——make和makefile

❤️前言 大家好&#xff0c;好久不见&#xff01;今天小狮子为大家带来的文章是一篇关于Linux下的项目自动化构建工具——make和makefile的博客&#xff0c;希望能帮助到大家。 正文 当我们进行涉及多文件的工程开发时&#xff0c;我们需要对很多不同类型、不同功能&#xff…

【批量将视频转为图像序列】

批量将视频转为图像序列 代码如下&#xff0c;代码中带有解释&#xff1a; # 导入所需要的库 import cv2 import os import numpy as np# 多个视频所在的路径 datasets_path ["/home/y/Code/数据集/1/007f.mp4","/home/y/Code/数据集/1/05f.mp4","/…

Android Java代码与JNI交互 JNI方法Java类字段 (六)

🔥 Android Studio 版本 🔥 🔥 Java 基础类型数据对应 Native层的字母 🔥 通过 jni 查找java某个类中相应字段对应的数据类型 , 需要使用到 jni 中的 GetFieldID() 函数 jfieldID GetFieldID(jclass clazz, const char* name, const char* sig){ return functions-…

可使用Linux 测试IP和端口是否能访问,查看返回状态码

一、 使用wget判断 wget是linux下的下载工具&#xff0c;需要先安装. 用法: wget ip:port wget ip:port连接存在的端口 二、使用telnet判断 telnet是windows标准服务&#xff0c;可以直接用&#xff1b;如果是linux机器&#xff0c;需要安装telnet. 用法: telnet ip port…

CNN从搭建到部署实战(pytorch+libtorch)

模型搭建 下面的代码搭建了CNN的开山之作LeNet的网络结构。 import torchclass LeNet(torch.nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv torch.nn.Sequential(torch.nn.Conv2d(1, 6, 5), # in_channels, out_channels, kernel_sizetorch.nn.Sig…

windows搭建git服务器 无法识别 ‘git‘ 命令:exec: “git“: executable file not found in %PATH%

无法识别 git 命令&#xff1a;exec: "git": executable file not found in %PATH% 确保已经安装git&#xff0c;如下图配置环境变量即可。