From e624e7eb99e7f9efd9bd3f9427b5d1c8b838f1b1 Mon Sep 17 00:00:00 2001 From: Keisuke KUDO <151166401+Apo-Matchbox@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:00:01 +0900 Subject: [PATCH] Create 617. Merge Two Binary Trees --- 617/617. Merge Two Binary Trees.md | 87 ++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 617/617. Merge Two Binary Trees.md diff --git a/617/617. Merge Two Binary Trees.md b/617/617. Merge Two Binary Trees.md new file mode 100644 index 0000000..66bf79f --- /dev/null +++ b/617/617. Merge Two Binary Trees.md @@ -0,0 +1,87 @@ +# [617. Merge Two Binary Trees](https://leetcode.com/problems/merge-two-binary-trees/description/) +## Step1 +/*答えを見て理解できたと思ったら、答えを隠して書いて下さい。筆が進まず、5分迷ったら答えを見て下さい。そして、見ちゃったら一回全部消してやり直しです。答えを送信して、正解になったら、まず1段落目です。*/ +### 問題意図の考察 +- 問題文の確認 + - 二分木:roo1, roo2が与えられる。 + - root1とroot2をマージして下さい、 + - ルールがある + - 2つのノードが重なる場合、その値を合計し新しいノードの値する + - どちらか一方がnullの場合、新しい木のノードとして採用する + +- 制約の確認 + - The number of nodes in both trees is in the range [0, 2000]. + - ノードの数は最大:2000 + - O(N), O(n log n)がベター、O(n^2)だと効率という点では微妙かな + - -10^4 <= Node.val <= 10^4 + - ノードの値:-10,000~10,000 + - 足しても +- 2 * 10^4 + +- 問題意図 + - 根から走査して、順番にマージできるか + +### 解法を考える。 +- 再帰の書き方が自然な流れのように感じる +- null の扱いができるか + - root1->nullの時、root2を返す + - root2->nullの時、root1を返す +- root1->val += root2->val +- root1の二分木にまとめる感覚 + +初回の回答 +```cpp +class Solution { +public: + TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { + if (root1 == nullptr) { + return root2; + } + if (root2 == nullptr) { + return root1; + } + + root1->val += root2->val; + + root1->left = mergeTrees(root1->left, root2->left); + root1->right = mergeTrees(root1->right, root2->right); + + return root1; + } +}; + +``` + +## Step2 +/*次にコードを読みやすくなるようにできるだけ整えましょう。これで動くコードになったら完成です。*/ +- 改善点 + - root1に足していくというのがシンプルだと思ったが、結構違うやり方をしている人が多い。 + - 最近シンプルに書けることによってしまってるかも知れない。選択肢を増やして正しい判断ができるようにしたい。 + - 今回の問題に関してはstep1が自然に感じるのでそのままstep3へ + +- 他の方のコードを読む + - https://github.com/5103246/LeetCode_Arai60/pull/22/commits/f2ddfbc88c74bb14d0f640f9b2a0d9f9f110003d + - https://github.com/nktr-cp/leetcode/pull/24/commits/1b6c1d4db51b3a4e22797b82da4be99b91b8e130#diff-d16010dc25fbb50a03680c436bbb0d90f462bf27b3aa26421f1df94d5f15aa15 + - 新しい二分木:new TreeNode()を作成する。root1/root2を壊さずに作成 + - node1, node2, merged_nodeと3つの組み合わせをキューに入れる + - dummyを用意 + - 関数内でメモリを確保した場合、呼び出し元で解放しないとメモリリークとなる。ので面倒で選択してない。 + - メモリ + - 動的メモリ:https://en.cppreference.com/w/cpp/language/new.html + - https://en.cppreference.com/w/cpp/memory.html + - Effective C++ 確認 + +- 他の解法 + - python + - https://github.com/tshimosake/arai60/pull/14/commits/253f33c504c73c4709dafa575c47a9a0f3f0b5ab + - + - C++ + - https://github.com/irohafternoon/LeetCode/pull/26/commits/d67d4b4a3959fb02d773249be55806988155817b + - https://github.com/Ryotaro25/leetcode_first60/pull/25/commits/b67018715bbcb6efaa049d09590460cbb23774b1#diff-1296319066657d7ffa73cc35ea8dab0b8bb061399fa3382e925bf62f940038e3 + + +## Step3 +/*そしたら、また全部消しましょう。今度は時間を測りながら、もう一回、書きましょう。書いてアクセプトされたら文字を消して再度書きましょう。これを10分以内に一回もエラーを出さずに書ける状態になるまで続けて下さい。3回続けてそれができたらその問題はひとまず丸です。*/ +1. 8min +2. 7min +3. 7min +