public class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;

  TreeNode() {}

  TreeNode(int val) {
    this.val = val;
  }

  TreeNode(int val, TreeNode left, TreeNode right) {
    this.val = val;
    this.left = left;
    this.right = right;
  }
}

class Solution {
  private int distribute(TreeNode node) {
    if (node == null) {
      return 0;
    }

    int left = distribute(node.left);
    int right = distribute(node.right);

    moves += Math.abs(left) + Math.abs(right);

    return node.val - 1 + left + right;
  }

  private int moves;

  public int distributeCoins(TreeNode root) {
    moves = 0;
    distribute(root);
    return moves;
  }
}