2023-07-14 Leetcode 979 在二叉树中分配硬币

181 阅读1分钟

Problem: 979. 在二叉树中分配硬币

思路

必然是递归来解

解题方法

从根节点出发,我们需要左子树的coins数量,右子树的coins数量,但实际上左子树应该只有nodes个coins,右子树也是,所以左子树需要途径根节点的数量是|coins - nodes|(可能是移出,也可能是移入),同理,右子树也是|coins - nodes|。 那么我们在遍历过程中,只需要记录两边子树的coins和nodes即可。

Code


/**
 * Definition for a binary tree node.
 * 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 ans;

    public int[] dfs(TreeNode node) {
        if (node == null) return new int[]{0, 0};
        var left = dfs(node.left);
        var right = dfs(node.right);
        int coins = left[0] + right[0] + node.val;
        int nodes = left[1] + right[1] + 1;
        ans += Math.abs(coins - nodes);
        return new int[]{coins, nodes};
    }
    public int distributeCoins(TreeNode root) {
        dfs(root);
        return ans;
    }
}