1. 程式人生 > 其它 >【LeetCode-979】在二叉樹中分配硬幣

【LeetCode-979】在二叉樹中分配硬幣

問題

給定一個有 N 個結點的二叉樹的根結點 root,樹中的每個結點上都對應有 node.val 枚硬幣,並且總共有 N 枚硬幣。

在一次移動中,我們可以選擇兩個相鄰的結點,然後將一枚硬幣從其中一個結點移動到另一個結點。(移動可以是從父結點到子結點,或者從子結點移動到父結點。)。

返回使每個結點上只有一枚硬幣所需的移動次數。

示例

輸入: [1,0,0,null,3]
輸出: 4

解答

class Solution {
public:
    int distributeCoins(TreeNode* root) {
        dfs(root); // 返回當前需要調整的數量
        return res;
    }
private:
    int res = 0;
    int dfs(TreeNode* root) {
        if (!root) return 0;
        int left = dfs(root->left);
        int right = dfs(root->right);
        res += abs(right) + abs(left);
        return root->val + left + right - 1;
    }
};

重點思路

dfs函式每次返回當前節點需要調整的數量,可正可負。總共有 N 枚硬幣,能夠保證到根結點時必定滿足題目要求。