问题

给定一个二叉树的root节点,二叉树中每个节点有node.val个coins,一种有N coins。 现在要求移动节点中的coins 使得二叉树最终每个节点的coins value都为1。每次移动,我们只能向相邻接点移动,也就是说coins 只能向父节点或者子节点移动,那么求最终需要移动多少步。

Leetcode原题链接: https://leetcode.com/problems/distribute-coins-in-binary-tree/

分析

如果叶子节点有0个coins,那么我们需要从parent节点移一个coin到叶子节点 (push (-1) 个coin from left node); ----move一次

如果说叶子节点有四个节点那么我们则需要push三个coins到父节点(push +3 coins from leaf node)。----move 三次

定义一个dfs(node)函数,用于表示需要从当前节点push 到its parent节点的coins个数(换句话说就是以当前节点为root的子树中的硬币总数 减去当前总数节点的个数),那么dfs(node) = dfs(node.left) + dfs(node.right) - 1 (减去一个1是因为留一个coin在当前节点) ,而使得以当前节点为root节点需要移动的步数等于abs(dfs(node.left)) + abs(dfs(node.right))。

实现

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

最新文章

  1. vim 命令详解
  2. Windowns 10打开此电脑缓慢问题的一种解决办法
  3. 转:Connection: close和Connection: keep-alive有什么区别?
  4. 解决dnu restore时的“Cannot handle address family”问题
  5. shell 随机从文件中抽取若干行
  6. 在Spring Data JPA 中使用Update Query更新实体类
  7. https+ssl详解
  8. POJ 2106 Boolean Expressions (布尔表达式求值)
  9. Core Animation系列之CADisplayLink(转)
  10. [置顶] Firefox OS 学习——简单了解知识
  11. Opentsdb 启动显示配置文件不存在
  12. “数学口袋精灵”App的第三个Sprint计划----开发日记
  13. openwrt 添加 802.1x客户端njit
  14. Top k问题的讨论(三种方法的java实现及适用范围)
  15. 数据库(mysql)
  16. JSON调试找不到 net.sf.ezmorph.Morpher
  17. HashMap(JDK1.9)详解
  18. FAILED Selenium2Library
  19. exBSGS学习笔记
  20. 【Networking】Libevent客户端例子

热门文章

  1. 基于 HTML5 + WebGL 的宇宙 3D 展示系统
  2. 深入浅出Spring(四)
  3. 《一张图看懂华为云BigData Pro鲲鹏大数据解决方案》
  4. git配置文件—— .editorconfig
  5. 【转】Nginx + CGI/FastCGI + C/Cpp
  6. 【JS】336- 拆解 JavaScript 中的异步模式
  7. Win32_PhysicalMedia 硬盘 参数说明
  8. 【树莓派】制作启动SD卡
  9. Manjaro-kde-18.1.3安装体验
  10. vue-cli3抽离配置文件,动态修改打包后配置