diff --git "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/617. Merge Two Binary Trees.md" "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/617. Merge Two Binary Trees.md" new file mode 100644 index 0000000..319b970 --- /dev/null +++ "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/617. Merge Two Binary Trees.md" @@ -0,0 +1,94 @@ + + +## DFSによる解法 (17m32s) +時間計算量: O(N) +空間計算量: O(3N) (root1 + root2 + merged root) + +下記の解法は、新しい木を作成しているため、空間計算量が最適ではないことに気が付く。 +### 1回目 +```python +class Solution: + def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: + if not root1: + return root2 + if not root2: + return root1 + + merged_root = TreeNode(root1.val + root2.val) + merged_root.left = self.mergeTrees(root1.left, root2.left) + merged_root.right = self.mergeTrees(root1.right, root2.right) + + return merged_root +``` + + +### 2~3回目 (変化なし) +mergeされる結果はrootだけではないため、変数名をmerged_nodeに変更 +時間計算量: 1回目と同じ
+空間計算量: 1回目と同じ + +```python +class Solution: + def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: + if not root1: + return root2 + if not root2: + return root1 + + merged_node = TreeNode(root1.val + root2.val) + merged_node.left = self.mergeTrees(root1.left, root2.left) + merged_node.right = self.mergeTrees(root1.right, root2.right) + + return merged_node +``` + +## 新しい木を作成しない解法 (root1にroot2をマージ) +時間計算量: O(N)
+空間計算量: O(2N) (root1 + root2) + +```python +class Solution: + def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: + if not root1: + return root2 + if not root2: + 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による解法 (新しい木を作成しない解法 (root1にroot2をマージ)) +あまり綺麗なコードにならなかった。特にif分岐がわかりづらい。 +時間計算量: O(N)
+空間計算量: O(2N) (root1 + root2) + +```python +class Solution: + def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: + if not root1: + return root2 + if not root2: + return root1 + + next_nodes = deque([(root1, root2)]) + while next_nodes: + node1, node2 = next_nodes.popleft() + node1.val += node2.val + + if node1.left and node2.left: + next_nodes.append((node1.left, node2.left)) + elif node2.left: + node1.left = node2.left + + if node1.right and node2.right: + next_nodes.append((node1.right, node2.right)) + elif node2.right: + node1.right = node2.right + + return root1 +```