Skip to content
Open
Show file tree
Hide file tree
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
527 changes: 527 additions & 0 deletions memo.md

Large diffs are not rendered by default.

32 changes: 32 additions & 0 deletions step1-1_recursion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# solved 8:33
from typing import Optional
from copy import deepcopy


# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right


class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:

def mergeTrees_helper(node1: Optional[TreeNode], node2: Optional[TreeNode]) -> Optional[TreeNode]:
if node1 is None:
return deepcopy(node2)
if node2 is None:
return deepcopy(node1)

merged_node = TreeNode(val=node1.val + node2.val)
merged_tree_left = mergeTrees_helper(node1.left, node2.left)
merged_tree_right = mergeTrees_helper(node1.right, node2.right)
merged_node.left = merged_tree_left
merged_node.right = merged_tree_right
return merged_node

return mergeTrees_helper(root1, root2)


55 changes: 55 additions & 0 deletions step1-2_dfs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from typing import Optional
from copy import deepcopy


# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if root1 is None:
return deepcopy(root2)
if root2 is None:
return deepcopy(root1)

merged_dummy_head = TreeNode()
tree1_frontier = [root1]
tree2_frontier = [root2]
merge_instructions = [(merged_dummy_head, "left")]
while tree1_frontier and tree2_frontier:
node1 = tree1_frontier.pop()
node2 = tree2_frontier.pop()
target, creation_side = merge_instructions.pop()
if node1 is None and node2 is None:
continue
if creation_side == "left":
if node1 is None:
target.left = deepcopy(node2)
continue
if node2 is None:
target.left = deepcopy(node1)
continue
merged_node = TreeNode(node1.val + node2.val)
target.left = merged_node
elif creation_side == "right":
if node1 is None:
target.right = deepcopy(node2)
continue
if node2 is None:
target.right = deepcopy(node1)
continue
merged_node = TreeNode(node1.val + node2.val)
target.right = merged_node
else:
raise ValueError("creation side should be either right or left")
tree1_frontier.append(node1.left)
tree2_frontier.append(node2.left)
merge_instructions.append((merged_node, "left"))
tree1_frontier.append(node1.right)
tree2_frontier.append(node2.right)
merge_instructions.append((merged_node, "right"))

return merged_dummy_head.left
51 changes: 51 additions & 0 deletions step1-3_bfs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from typing import Optional
from collections import deque
from copy import deepcopy


# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if root1 is None:
return deepcopy(root2)
if root2 is None:
return deepcopy(root1)

dummy_merged_root = TreeNode()
frontier = deque([(root1, root2, dummy_merged_root, "left")])
while frontier:
next_frontier = deque()
while frontier:
node1, node2, target_node, creation_side = frontier.popleft()
if node1 is None and node2 is None:
continue
if node1 is None:
if creation_side == "left":
target_node.left = deepcopy(node2)
continue
if creation_side == "right":
target_node.right = deepcopy(node2)
continue
if node2 is None:
if creation_side == "left":
target_node.left = deepcopy(node1)
continue
if creation_side == "right":
target_node.right = deepcopy(node1)
continue
merged_node = TreeNode(node1.val + node2.val)
if creation_side == "left":
target_node.left = merged_node
elif creation_side == "right":
target_node.right = merged_node
next_frontier.append((node1.left, node2.left, merged_node, "left"))
next_frontier.append((node1.right, node2.right, merged_node, "right"))
frontier = next_frontier
return dummy_merged_root.left


28 changes: 28 additions & 0 deletions step2-1_recursion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from typing import Optional
from copy import deepcopy


# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right


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 deepcopy(root2)
if root2 is None:
return deepcopy(root1)

merged_node = TreeNode(val=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



57 changes: 57 additions & 0 deletions step2-2_dfs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from typing import Optional
from copy import deepcopy


# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
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 deepcopy(root2)
if root2 is None:
return deepcopy(root1)

def get_merged_val(node1, node2):
val = 0
if node1 is not None:
val += node1.val
if node2 is not None:
val += node2.val
return val

def get_left(node):
if node is None:
return None
return node.left

def get_right(node):
if node is None:
return None
return node.right


merged_root = TreeNode()
frontier = [(root1, root2, merged_root)]
while frontier:
node1, node2, merged_node = frontier.pop()
merged_node.val = get_merged_val(node1, node2)

node1_left = get_left(node1)
node2_left = get_left(node2)
if node1_left is not None or node2_left is not None:
merged_node.left = TreeNode()
frontier.append((node1_left, node2_left, merged_node.left))

node1_right = get_right(node1)
node2_right = get_right(node2)
if node1_right is not None or node2_right is not None:
merged_node.right = TreeNode()
frontier.append((node1_right, node2_right, merged_node.right))

return merged_root
57 changes: 57 additions & 0 deletions step2-3_bfs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from typing import Optional
from copy import deepcopy


# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
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 deepcopy(root2)
if root2 is None:
return deepcopy(root1)

def get_merged_val(node1, node2):
val = 0
if node1 is not None:
val += node1.val
if node2 is not None:
val += node2.val
return val

def get_left(node):
if node is None:
return None
return node.left

def get_right(node):
if node is None:
return None
return node.right

merged_root = TreeNode()
frontier = [(root1, root2, merged_root)]
while frontier:
next_frontier = []
while frontier:
node1, node2, merged_node = frontier.pop()
merged_node.val = get_merged_val(node1, node2)

node1_left, node2_left = get_left(node1), get_left(node2)
if node1_left is not None or node2_left is not None:
merged_node.left = TreeNode()
next_frontier.append((node1_left, node2_left, merged_node.left))
node1_right, node2_right = get_right(node1), get_right(node2)
if node1_right is not None or node2_right is not None:
merged_node.right = TreeNode()
next_frontier.append((node1_right, node2_right, merged_node.right))
frontier = next_frontier
return merged_root


27 changes: 27 additions & 0 deletions step3-1_recursion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 1st: 1:30
# 2nd: 1:20
from typing import Optional
from copy import deepcopy


# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right


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 deepcopy(root2)
if root2 is None:
return deepcopy(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
53 changes: 53 additions & 0 deletions step3-2_dfs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# 1st: 3:28
# 2nd: 3:20
from typing import Optional
from copy import deepcopy


# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
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 deepcopy(root2)
if root2 is None:
return deepcopy(root1)

def get_merged_val(node1, node2):
val = 0
if node1 is not None:
val += node1.val
if node2 is not None:
val += node2.val
return val

def get_left(node):
if node is None:
return None
return node.left

def get_right(node):
if node is None:
return None
return node.right

merged_root = TreeNode()
frontier = [(root1, root2, merged_root)]
while frontier:
node1, node2, merged_node = frontier.pop()
merged_node.val = get_merged_val(node1, node2)
node1_left, node2_left = get_left(node1), get_left(node2)
if node1_left is not None or node2_left is not None:
merged_node.left = TreeNode()
frontier.append((node1_left, node2_left, merged_node.left))
node1_right, node2_right = get_right(node1), get_right(node2)
if node1_right is not None or node2_right is not None:
merged_node.right = TreeNode()
frontier.append((node1_right, node2_right, merged_node.right))
return merged_root
Loading