2023-07-14 1 日 1 つの質問
1. トピック番号
979. 在二叉树中分配硬币
2. トピックリンク
3. トピックの説明
N 個のノードを持つバイナリ ツリーのルート ノード root を考えると、ツリー内の各ノードはnode.val コインに対応し、合計で N 個のコインが存在します。
1 回の移動で、隣接する 2 つのノードを選択し、一方からもう一方にコインを移動できます。(移動は、親ノードから子ノードへ、または子ノードから親ノードへ行うことができます。)
各ノードでコインを 1 つだけ取得するのに必要な移動数を返します。
ヒント:
- 1<= N <= 100
- 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) 最後に結果を返します。