Leetcode979。バイナリツリーにコインを割り当てます

問題:N個のノードを持つバイナリツリーのルートノードルートを考えると、ツリー内の各ノードはnode.valコインに対応し、合計でN個のコインがあります。

移動では、2つの隣接するノードを選択してから、コインを1つのノードから別のノードに移動できます。(移動は、親ノードから子ノードへ、または子ノードから親ノードへ行うことができます。)

各ノードで1つのコインのみを作成するために必要な移動数を返します。

出典:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/distribute-coins-in-binary-tree
著作権はLeetCodeが所有しています商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。

コード

class Solution {
    
    
     int ans=0;
    public int distributeCoins(TreeNode root) {
    
    
        
        dfs(root);
        return ans;
    }

    public int dfs(TreeNode node) {
    
    
        if (node == null) return 0;
        int L = dfs(node.left);
        int R = dfs(node.right);
        ans += Math.abs(L) + Math.abs(R);
        return node.val + L + R - 1;
    }
}

dfsは、現在のノードの負荷を計算します。ノードの値が0でリーフノードの場合、負荷は-1です。値がnの場合、負荷はn-1です。非リーフノードの負荷は左側です。子と右子の荷重は、それ自体の荷重に加算され、1が差し引かれます。これは、持っているコインを移動する必要がないためです。次に、メンバー変数ansを定義して、すべてのノードの合計負荷を記録します。ルートノードの負荷は、コインが移動する必要がある回数です。

おすすめ

転載: blog.csdn.net/qq_45789385/article/details/102747935