前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang刷leetcode二叉树(12)在二叉树中分配硬币

golang刷leetcode二叉树(12)在二叉树中分配硬币

作者头像
golangLeetcode
发布2022-08-02 16:06:04
1990
发布2022-08-02 16:06:04
举报
文章被收录于专栏:golang算法架构leetcode技术php

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

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

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

示例 1:

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

示例 2:

代码语言:javascript
复制
输入:[0,3,0]
输出:3
解释:从根结点的左子结点开始,我们将两枚硬币移到根结点上 [移动两次]。然后,我们把一枚硬币从根结点移到右子结点上。

示例 3:

代码语言:javascript
复制
输入:[1,0,2]
输出:2

示例 4:

代码语言:javascript
复制
输入:[1,0,0,null,3]
输出:4

提示:

  1. 1<= N <= 100
  2. 0 <= node.val <= N

解题思路:

1,递归

2,每个节点需要移动的次数=需要移动到所有孩子节点的次数+当前节点的金币数-1 (缺少的需要补齐,多余的要移走)

3,如果节点没有金币需要移动一个进来

4,父节点需要移动的金币数为左右子树积累流入/流出和+自己金币数-1

5,根节点不需要流入流出

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var sum int
func distributeCoins(root *TreeNode) int {
    sum=0
    moved(root)
    return sum
}

func moved(root*TreeNode)int{
    if root==nil{
        return 0
    }
    l:=moved(root.Left)
    r:=moved(root.Right)
    s:=abs(l)+abs(r)
    sum+=s
    return root.Val+l+r-1
}
func abs(a int)int{
    if a>=0{
        return a
    }
    return -a
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档