This question can be solved by recursion, which is usually employed for tree questions.
One way to think is using post-order recursion.
First of all, we need to figure out what should be returned. It should be the coins number from the left + right + root->val - 1. Minus 1 because we need to keep one at root.
Then next, we should to ask: what is the moves required? If there are more coins than needed in a subtree, we need to move; but if there are less than needed, we also need to move!
Thus, we need to calculate the absolute values for the number of moves.
See the code below:
- /**
- * 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 distributeCoins(TreeNode* root) {
- res = 0;
- helper(root);
- return res;
- }
- private:
- int res;
- int helper(TreeNode* root) {
- if(!root) return 0;
- int l = helper(root->left), r = helper(root->right);
- res += abs(l) + abs(r);
- // cout<<res<<endl;
- return l + r + root->val - 1;
- }
- };
No comments:
Post a Comment