Descripción
Dada la raíz de un árbol binario con N nodos, cada nodo en el árbol tiene monedas node.val, y hay N monedas en total.
En un movimiento, podemos elegir dos nodos adyacentes y mover una moneda de un nodo a otro. (El cambio puede ser de padre a hijo o de hijo a padre).
Devuelve el número de movimientos necesarios para que cada nodo tenga exactamente una moneda.
Ejemplo 1:
Input: [3,0,0]
Output: 2
Explanation: From the root of the tree, we move one coin to its left child, and one coin to its right child.
Ejemplo 2:
Input: [0,3,0]
Output: 3
Explanation: From the left child of the root, we move two coins to the root [taking two moves]. Then, we move one coin from the root of the tree to the right child.
Ejemplo 3:
Input: [1,0,2]
Output: 2
Ejemplo 4:
Input: [1,0,0,null,3]
Output: 4
Nota:
- 1 <= N <= 100
- 0 <= nodo.val <= N
análisis
El significado de la pregunta es: Dado un árbol binario, el valor del nodo representa el número de monedas, y ahora necesitamos distribuir uniformemente las monedas en cada nodo y encontrar el número de movimientos de monedas. No hice esta pregunta, me referí a las ideas de otras personas.
abs(dfs(node.left)) + abs(dfs(node.right))
Indica el número de pasos de la moneda a mover
node.val + dfs(node.left) + dfs(node.right) - 1
Indica la cantidad de monedas extra para el nodo actual.
Si puedes pensar en esto, será fácil de manejar y saldrá la recursividad, pero es posible que la idea no se pueda pensar jajaja, especialmente la fórmula del rompecabezas anterior necesita encontrar una regla
Código
# 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 solve(self,root):
if(root is None):
return 0
l=self.solve(root.left)
r=self.solve(root.right)
self.res+=abs(l)+abs(r)
return root.val+l+r-1
def distributeCoins(self, root: TreeNode) -> int:
self.res=0
self.solve(root)
return self.res