You are given the root of a binary tree with n nodes where each node in the tree has node.val coins. There are n coins in total throughout the whole tree.
In one move, we may choose two adjacent nodes and move one coin from one node to another. A move may be from parent to child, or from child to parent.
Return the minimum number of moves required to make every node have exactly one coin
이진트리의 루트가 주어지고 노드는 정수 값을 포함한다.
한 노드에서 한 노드로 값 1을 전달해줄수 있을때, 모든 노드가 1을 값으로 가지기 위해 필요한 전달 횟수를 구하시오.
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def distributeCoins(self, root: Optional[TreeNode]) -> int:
self.res = 0
def dfs(cur):
# 없을 경우 사이즈 = 0, 코인 = 0
if not cur:
return [0, 0]
# 왼쪽 서브트리와 오른쪽 서브트리 취합
l_size, l_coin = dfs(cur.left)
r_size, r_coin = dfs(cur.right)
# 서브트리의 크기와 총 노드 합
size = 1 + l_size + r_size
coins = cur.val + l_coin + r_coin
# 필요한 최소한의 이동을 구해 전역변수에 더한다.
self.res += abs(size - coins)
# 상위 루트를 위해 전달. ( 최종적으로는 사용되지 않음 )
return [size, coins]
dfs(root)
return self.res