在二叉树中分配硬币(python)

题目描述:

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

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

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

示例1:

        

输入:[3,0,0]

输出:2

解释:从树的根节点开始,我们将一枚硬币移到它的左子节点上,一枚硬币移到它的右子节点上。

示例2:

        

输入:[0,3,0]

输出:3

解释:从根节点的左子节点开始,我们将两枚硬币移到根节点上[移动两次]。然后,我们把一枚硬币从根节点移到右子节点上。

示例3:

        

输入:[1,0,2]

输出:2

示例4:

        

输入:[1,0,0,null,3]

输出:4

提示:

  1. 1<= N <= 100
  2. 0 <= node.val <= N
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def distributeCoins(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        #思路:后序遍历,遍历到的每个节点仅保留一个硬币,其余的交给父节点。交硬币的过程即为硬币的移动过程
        res = [0]
        
        def move_count(node):
            if node == None:
                return 0
            else:
                left = move_count(node.left)
                right = move_count(node.right)
                count_ = node.val + left + right - 1
                res[0] = res[0] + abs(count_)
                return count_
            
        move_count(root)
        return res[0]

 菜鸟一枚,代码仅供参考,如有问题,望指正~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值