【LeetCode-979】在二叉樹中分配硬幣
阿新 • • 發佈:2021-08-28
問題
給定一個有 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 枚硬幣,能夠保證到根結點時必定滿足題目要求。