From bb70b780bf834d7029e4c48bae31ee25df55a4f0 Mon Sep 17 00:00:00 2001 From: tarinaihitori Date: Thu, 2 Jan 2025 22:24:57 +0900 Subject: [PATCH 1/2] step2 --- 617. Merge Two Binary Trees.md | 71 ++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 617. Merge Two Binary Trees.md diff --git a/617. Merge Two Binary Trees.md b/617. Merge Two Binary Trees.md new file mode 100644 index 0000000..2735af9 --- /dev/null +++ b/617. Merge Two Binary Trees.md @@ -0,0 +1,71 @@ +1st + +```python +class Solution: + def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: + if root1 is None: + return root2 + if root2 is None: + return root1 + + new_tree = TreeNode(root1.val + root2.val) + + new_tree.left = self.mergeTrees(root1.left, root2.left) + new_tree.right = self.mergeTrees(root1.right, root2.right) + return new_tree +``` + +2nd +新しくツリーを作るのではなく、一つのツリーに重ねる方法にする + +```python +class Solution: + def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: + if root1 is None: + return root2 + if root2 is None: + return root1 + + root1.val += root2.val + root1.left = self.mergeTrees(root1.left, root2.left) + root1.right = self.mergeTrees(root1.right, root2.right) + return root1 + +``` + +BFS で書いた。 + +```python +class Solution: + def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode: + if not root1: + return root2 + if not root2: + return root1 + + merged_root = TreeNode(root1.val + root2.val) + + queue = deque([(root1, root2, merged_root)]) + + while queue: + node1, node2, merged_node = queue.popleft() + if node1.left and node2.left: + merged_left = TreeNode(node1.left.val + node2.left.val) + merged_node.left = merged_left + queue.append((node1.left, node2.left, merged_left)) + elif node1.left: + merged_node.left = node1.left + elif node2.left: + merged_node.left = node2.left + + if node1.right and node2.right: + merged_right = TreeNode(node1.right.val + node2.right.val) + merged_node.right = merged_right + queue.append((node1.right, node2.right, merged_right)) + elif node1.right: + merged_node.right = node1.right + elif node2.right: + merged_node.right = node2.right + + return merged_root +``` From 3661cef8b334d992a50e919393c5db1b8e22f9e0 Mon Sep 17 00:00:00 2001 From: tarinaihitori Date: Wed, 15 Jan 2025 23:28:49 +0900 Subject: [PATCH 2/2] =?UTF-8?q?step3=E3=81=BE=E3=81=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 617. Merge Two Binary Trees.md | 39 ++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/617. Merge Two Binary Trees.md b/617. Merge Two Binary Trees.md index 2735af9..c1d3ec9 100644 --- a/617. Merge Two Binary Trees.md +++ b/617. Merge Two Binary Trees.md @@ -1,8 +1,13 @@ 1st +再帰が思いついたので、再帰で書く。 +時間計算量:O(n) +空間計算量:O(n) バランスしている木の場合は O(logn) ```python class Solution: def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: + if root1 is None and root2 is None: + return None if root1 is None: return root2 if root2 is None: @@ -16,7 +21,9 @@ class Solution: ``` 2nd -新しくツリーを作るのではなく、一つのツリーに重ねる方法にする +新しくツリーを作るのではなく、一つのツリーに重ねる方法にする。入力を破壊しても良い場合はこれでもよさそう。あとメモリ使用量も若干効率がいい。 +個人的にはイミュータブルのほうが安全で嬉しいので、新しくツリーを作るほうを選ぶ。 +`if root1 is None and root2 is None`はなくてもよいことに気づいたので、削除した。 ```python class Solution: @@ -33,7 +40,8 @@ class Solution: ``` -BFS で書いた。 +BFS で書いたが、左右両方に子がある場合、左側に子がある場合など条件が複雑になった。 +スタックオーバーフローは考慮しなければならないが、node の数が大きくない場合は再帰で書きたい。 ```python class Solution: @@ -69,3 +77,30 @@ class Solution: return merged_root ``` + +過去ログを見る。 +https://github.com/fhiyo/leetcode/pull/25 + +3rd +再帰の方法を選んだ。 +理由は、 +もしライブラリーを使う人が、 +「この関数は、root1 をただ読むだけだろう」と思い込んでいて、「マージの結果として新しいツリーを返すだけだろう」と予想している状態で、実際は root1 をガンガン上書きする関数が呼ばれたら、 +後から root1 を再利用しようとしたときに予期せぬ値や構造になっていて「えっ、なんでツリーが書き換わってるの?」と驚くことになりそうだと思った。 +もし破壊的に書くなら、 +ライブラリのドキュメントに「破壊的です」と書くかな。 + +```python +class Solution: + def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode: + if root1 is None: + return root2 + if root2 is None: + return root1 + + new_node = TreeNode(root1.val + root2.val) + new_node.left = self.mergeTrees(root1.left, root2.left) + new_node.right = self.mergeTrees(root1.right, root2.right) + + return new_node +```