2023-07-14 LeetCode 毎日の質問 (バイナリ ツリーでコインを配布)

2023-07-14 1 日 1 つの質問

1. トピック番号

979. 在二叉树中分配硬币

2. トピックリンク

クリックするとトピックの場所にジャンプします

3. トピックの説明

N 個のノードを持つバイナリ ツリーのルート ノード root を考えると、ツリー内の各ノードはnode.val コインに対応し、合計で N 個のコインが存在します。

1 回の移動で、隣接する 2 つのノードを選択し、一方からもう一方にコインを移動できます。(移動は、親ノードから子ノードへ、または子ノードから親ノードへ行うことができます。)

各ノードでコインを 1 つだけ取得するのに必要な移動数を返します。

ヒント:

  1. 1<= N <= 100
  2. 0 <= ノード.val <= N

4. 問題解決コード

/**
 * 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 {
    
    
public:
    int res = 0;
    int dfs(TreeNode* root){
    
    
        if(root == nullptr){
    
    
            return 0;
        }
        int move_left = 0; // 硬币在左子树所需要移动的个数
        int move_right = 0; // 硬币在右子树所需要移动的个数
        if(root->left){
    
    
            move_left = dfs(root->left);
        }
        if(root->right){
    
    
            move_right = dfs(root->right);
        }
        res += abs(move_left) + abs(move_right);
    return move_left + move_right + root->val - 1;
    }
    int distributeCoins(TreeNode* root) {
    
    
        dfs(root);
    return res;
    }
};

5、問題解決のアイデア

(1) まず、木の中でコインをどう動かすかという問題を考えます。

(2) 最も単純な考え方は木で、左側にコインが移動し、右側にコインが移動する場合、必要な移動数は、左側に移動するコインの数 + コインの移動数になります。右側に。

(3) しかし、問題があります。たとえば、3 つのノード (左右に 2 つのノード) を持つサブツリーがあり、左側のサブツリーには 3 枚のコインがあり、右側のサブツリーにはコインがなく、ルートにはコインがありません。この場合、左側のサブツリー内で移動する必要があるコインの数は 3 - 1 になります。右側のサブツリーの移動数は 0 ~ 1 に設定され、絶対値は 1 に等しくなります。また、左右2つのノードサブツリーはコインを必要としないため、再帰する場合、左右の移動回数は0になります。実際に再帰する場合は追加する必要があります。

(4) 最後に結果を返します。

おすすめ

転載: blog.csdn.net/qq_56086076/article/details/131715654