2
2
3
3
# Definition for a binary tree node.
4
4
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
9
9
10
10
from collections import deque
11
11
12
12
class Solution :
13
13
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
22
27
23
- def solve_iteratively (self , t1 : TreeNode , t2 : TreeNode ) -> TreeNode :
28
+ def solution2_iterative_inplace (self , t1 , t2 ) :
24
29
if not t1 or not t2 : return t1 or t2
25
30
26
31
q = deque ()
@@ -29,13 +34,50 @@ def solve_iteratively(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
29
34
v1 , v2 = q .popleft ()
30
35
v1 .val = v1 .val + v2 .val
31
36
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
34
41
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
37
46
return t1
38
47
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