The Indian Engineer

Problem 979 Distribute Coins in Binary Tree

Posted on 3 mins

Dfs Recursion Postorder Binary-Tree

Problem Statement

Link - Problem 979

Question

You are given the root of a binary tree with n nodes where each node in the tree has node.val coins. There are n coins in total throughout the whole tree.

In one move, we may choose two adjacent nodes and move one coin from one node to another. A move may be from parent to child, or from child to parent.

Return the minimum number of moves required to make every node have exactly one coin.

Note

Example 1

Input: root = [3,0,0]
Output: 2
Explanation: From the root of the tree, we move one coin to its left child, and one coin to its right child.

Example 2

Input: root = [0,3,0]
Output: 3
Explanation: From the left child of the root, we move two coins to the root [taking two moves]. Then, we move one coin from the root of the tree to the right child.

Example 3 (Important case)

Since the only constraint is number of coins in the tree is same as number of nodes, it can be distributed in any manner.

Input: root = [1,0,2]
Output: 2
Explanation: From the root of the tree, we move one coin to the left child.
             From right child, we move one coin to the root.

Constraints

Solution

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    int countSteps(TreeNode* root, int& step)
    {
        if( root == nullptr)
            return 0;
        int leftCoin = countSteps(root->left,step);
        int rightCoin = countSteps(root->right,step);
        step += abs(leftCoin) + abs(rightCoin);
        return (root->val -1) + leftCoin + rightCoin;
    }

public:
    int distributeCoins(TreeNode* root) {
        int ans = 0;
        countSteps(root,ans);
        return ans;

    }
};

Complexity Analysis

Explanation

1. Intuition

2. Implementation