Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions 競技プロ就活部PR用/617. Merge Two Binary Trees.md
Original file line number Diff line number Diff line change
@@ -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回目と同じ<br>
空間計算量: 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)<br>
空間計算量: 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)<br>
空間計算量: 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
```