https://leetcode.com/problems/distribute-coins-in-binary-tree/
n个硬币随机分布在n个点上,要求每个点都拥有一个硬币,问最小的花费。
对每一个root进行考虑,如果以他为根的子树的硬币个数大于节点个数,也就是说他多出来了x枚硬币,那么这x枚硬币一定是要走向他的父亲的,因为儿子不在需要了。此时就会在这条边产生x的贡献;反之就是需求硬币,是要从他父亲向他产生x的贡献。最后返回当前节点处理完之后剩余的硬币个数(正数即为多余,负数就是需求)。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 int res; 13 int dfs(TreeNode* root){ 14 if(root==NULL)return 0; 15 int L=dfs(root->left); 16 int R=dfs(root->right); 17 res+=abs(L)+abs(R); 18 return root->val+L+R-1; 19 } 20 21 int distributeCoins(TreeNode* root) { 22 res=0; 23 dfs(root); 24 return res; 25 } 26 };