Skip to content

Commit fa3676a

Browse files
committed
LeetCode: 617 solved (3 solutions)
1 parent 13e3903 commit fa3676a

File tree

1 file changed

+62
-20
lines changed

1 file changed

+62
-20
lines changed

Python/LeetCode/617. Merge Two Binary Trees.py

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,30 @@
22

33
# Definition for a binary tree node.
44
class TreeNode:
5-
def __init__(self, x):
6-
self.val = x
7-
self.left = None
8-
self.right = None
5+
def __init__(self, val=0, left=None, right=None):
6+
self.val = val
7+
self.left = left
8+
self.right = right
99

1010
from collections import deque
1111

1212
class Solution:
1313

14-
def solve_recursively_new_tree(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
15-
if t1 and t2:
16-
root = TreeNode(t1.val + t2.val)
17-
root.left = self.solve_recursively_new_tree(t1.left, t2.left)
18-
root.right = self.solve_recursively_new_tree(t1.right, t2.right)
19-
return root
20-
else:
21-
return t1 or t2
14+
def mergeTrees(self, t1, t2):
15+
# return self.solution1_recursive_inplace(t1, t2)
16+
# return self.solution2_iterative_inplace(t1, t2)
17+
return self.solution3_iterative_using_new_tree(t1, t2)
18+
19+
# Time O(min(n, m))
20+
def solution1_recursive_inplace(self, t1, t2):
21+
if not t1 or not t2: return t1 or t2
22+
23+
node = TreeNode(t1.val + t2.val)
24+
node.left = self.solution1_recursive_inplace(t1.left, t2.left)
25+
node.right = self.solution1_recursive_inplace(t1.right, t2.right)
26+
return node
2227

23-
def solve_iteratively(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
28+
def solution2_iterative_inplace(self, t1, t2):
2429
if not t1 or not t2: return t1 or t2
2530

2631
q = deque()
@@ -29,13 +34,50 @@ def solve_iteratively(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
2934
v1, v2 = q.popleft()
3035
v1.val = v1.val + v2.val
3136

32-
if v1.left and v2.left: q.append([v1.left, v2.left])
33-
elif v2.left: v1.left = v2.left #t1.left is None
37+
if v1.left and v2.left:
38+
q.append((v1.left, v2.left))
39+
elif v2.left:
40+
v1.left = v2.left
3441

35-
if v1.right and v2.right: q.append([v1.right, v2.right])
36-
elif v2.right: v1.right = v2.right #t1.right is None
42+
if v1.right and v2.right:
43+
q.append((v1.right, v2.right))
44+
elif v2.right:
45+
v1.right = v2.right
3746
return t1
3847

39-
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
40-
# return self.solve_recursively_new_tree(t1, t2)
41-
return self.solve_iteratively(t1, t2)
48+
def solution3_iterative_using_new_tree(self, t1, t2):
49+
50+
def make_tree(node):
51+
if not node: return None
52+
tree = TreeNode(node.val)
53+
tree.left = make_tree(node.left)
54+
tree.right = make_tree(node.right)
55+
return tree
56+
57+
if not t1 or not t2: return make_tree(t1 or t2)
58+
59+
res = TreeNode()
60+
q = deque()
61+
q.append((t1, t2, res))
62+
63+
while q:
64+
t1, t2, t3 = q.popleft()
65+
t3.val = t1.val + t2.val
66+
67+
if t1.left and t2.left:
68+
t3.left = TreeNode()
69+
q.append((t1.left, t2.left, t3.left))
70+
elif t1.left:
71+
t3.left = make_tree(t1.left)
72+
elif t2.left:
73+
t3.left = make_tree(t2.left)
74+
75+
if t1.right and t2.right:
76+
t3.right = TreeNode()
77+
q.append((t1.right, t2.right, t3.right))
78+
elif t1.right:
79+
t3.right = make_tree(t1.right)
80+
elif t2.right:
81+
t3.right = make_tree(t2.right)
82+
83+
return res

0 commit comments

Comments
 (0)