leetcode-979-树

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 };

 

posted @ 2019-02-20 11:00  *zzq  阅读(260)  评论(0编辑  收藏  举报