给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。

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

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

示例 1:

输入:[3,0,0]
输出:2
解释:从树的根结点开始,我们将一枚硬币移到它的左子结点上,一枚硬币移到它的右子结点上。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/distribute-coins-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————————
解题思路:使用深度优先遍历,创建一个函数funs(root),该函数的作用是计算当前结点root的金币量(这时候当前节点的子节点的金币数都为1)。

当知道当前节点的左子节点的金币数量和当前节点的右子节点的金币数量,就可以知道当左子节点和右子节点的金币数为1时当前节点的金币个数和需要移动的次数。

用变量ans保存整体需要移动的金币次数。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def __init__(self):self.ans = 0def distributeCoins(self, root: TreeNode) -> int:def funs(root):if not root:return 0elif root.right and root.left:  # 如果存在左子树和右子树numl = funs(root.left) # 计算左子节点的金币数numr = funs(root.right) # 计算右子节点的禁金币数self.ans += abs(numl-1) + abs(numr-1) # 左子节点和右子节点的金币数为1需要移动的次数return root.val + numl + numr - 2 # 更新当前节点的金币数elif root.left: # 如果右子树为空num = funs(root.left) # 计算左子节点的金币数self.ans += abs(num-1)  # 左子节点金币数为1需要移动的次数return root.val + num - 1 # 更新当前节点的金币数elif root.right: # 如果左子树为空num = funs(root.right)  # 计算右子节点的金币数self.ans += abs(num-1)  # 右子节点金币数为1需要移动的次数return root.val + num - 1  # 更新当前节点的金币数else:return root.val  # 如果没有左右子树,返回当前结点的金币数funs(root) return self.ans

该算法会遍历二叉树的每一个节点,因此时间复杂度为O(n),需要使用堆栈,因此空间复杂度为O(H),H为二叉树的高度。

leetcode —— 979. 在二叉树中分配硬币相关推荐

  1. LeetCode 979. 在二叉树中分配硬币(DFS)

    文章目录 1. 题目 2. DFS 解题 1. 题目 给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币. 在一次移动中,我们 ...

  2. LeetCode979. 在二叉树中分配硬币

    问题:979. 在二叉树中分配硬币 给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币. 在一次移动中,我们可以选择两个相邻的 ...

  3. leetcode979. 在二叉树中分配硬币(dfs)

    给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币. 在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移 ...

  4. LeetCode实战:二叉树中的最大路径和

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a non ...

  5. leetcode算法题--二叉树中的最长交错路径★

    原题链接:https://leetcode-cn.com/problems/longest-zigzag-path-in-a-binary-tree/ 嵌套递归(超时) 相关题目:二叉树中的列表 in ...

  6. leetcode算法题--二叉树中序遍历迭代法

    原题链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 二叉树中序遍历迭代法,栈实现 vector<int> ...

  7. Java实现 LeetCode 623 在二叉树中增加一行(遍历树)

    623. 在二叉树中增加一行 给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N, ...

  8. LeetCode 1602. 找到二叉树中最近的右侧节点(BFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一棵二叉树的根节点 root 和树中的一个节点 u ,返回与 u 所在层中距离最近的右侧节点,当 u 是所在层中最右侧的节点,返回 null . 示例 ...

  9. LeetCode 623. 在二叉树中增加一行(BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整 ...

最新文章

  1. 为何 NLP 领域难以出现“独角兽”?
  2. 背景建模与前景检测1(Background Generation And Foreground Detection)
  3. Understanding transient variables in Java and how they are practically used in HashMap---reference
  4. 为企业门户提供问答式检索--------让系统能回答普通用户提出的问题
  5. 复合类型_没有学不会的python--复合类型(1)--概念和元组
  6. 浅谈BP神经网络的Matlab实现
  7. cocos2d-x 在vs2010下的环境配置
  8. html meta标签
  9. 博文视点读书节第五日丨IT大咖私房书单继续放送,超级会员返场来袭!
  10. 分布式消息系列:详解RocketMQ的简介与演进、架构设计、关键特性与应用场景
  11. 富勒wms系统里的定时器id_WMS项目实施,该如何调研?
  12. html文字闪光效果,css实现字体闪烁效果
  13. 小白量化彩票实战(1)彩票分析及爬虫双色球彩票开奖数据
  14. 系统分析与设计-敏捷迭代方法课后习题答案+学习笔记(答案见最后)
  15. 一年之计在于春丨看, 农田里的科技范儿
  16. 【大数据技术应用实战】【大数据与人工智能视角下数字孪生和元宇宙】二、新一轮大数据与人工智能变革
  17. SQL 2008函数大全
  18. 怎么给图片添加贴纸?介绍几个简单的方法
  19. 邮箱怎么登录网页版,你知道吗
  20. Drone SETTINGS 页面没有 Trusted

热门文章

  1. 923D - 单片机进阶步骤
  2. Filter使用详解
  3. Silverlight实例教程 - 理解Navigation导航框架Frame类
  4. Flowable工作流入门
  5. 容器编排技术 -- Kubernetes kubectl autoscale 命令详解
  6. java 课后习题 计算两个日期之间的天数
  7. docker安装redis并将配置文件和数据文件映射到外部
  8. mysql基本功能+show+innodb+索引+慢sql+explain
  9. bec初级第一课_在您的第一个初级开发人员工作中如何生存和发展
  10. 谷歌聊天机器人api_如何编写针对Google地图等网络应用量身定制的聊天机器人