1.深度优先搜索
对于每一个节点,其值大于1,则送出root->val-1个硬币,其值为0,则需要接受-1个硬币
对于节点i,将其多余的硬币送给其父节点,父节点拥有的金币增加;将其缺少的金币向父节点索取,父节点拥有的金币减少(可能为负值),此时父节点再执行同样的操作
则所需的步数就是每个节点送给其父节点或向父节点索取的金币的个数
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int res=0;
int distributeCoins(TreeNode* root) {
dfs(root);
return res;
}
int dfs(TreeNode *root)
{
if(root==NULL)
return 0;
root->val+=dfs(root->left)+dfs(root->right);
int num=root->val-1;//num的值表示root及其节点经过内部消化之后传递出去或者还缺少的金币的数量,负数表示缺少
res+=abs(num);
return num;
}
};