题目描述:
给定一个有 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<= N <= 100
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]
菜鸟一枚,代码仅供参考,如有问题,望指正~