Merge Two Binary Trees

題目

做法一:recursive - DFS

  1. 找出最小的可重複動作:merge 兩個 nodes

    • 題目給的 method 就可以用來做遞迴
  2. 假設 mergeTrees 已完成,實作此最小可重複動作

    1
    2
    3
    4
    root1.val += root2.val
    root1.left = self.mergeTrees(root1.left, root2.left)
    root1.right = self.mergeTrees(root1.right, root2.right)
    return root1
  3. 寫出遞迴的終止條件

    1
    2
    if not root1 or not root2:
    return root1 or root2

Python3 solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if not root1 or not root2:
return root1 or root2
root1.val += root2.val
root1.left = self.mergeTrees(root1.left, root2.left)
root1.right = self.mergeTrees(root1.right, root2.right)
return root1

假設兩棵樹有較少節點的那顆有 n 個節點

  • 時間複雜度:O(n)
  • 空間複雜度:n 個節點那棵樹的深度
    • 最差情況是 O(n), 平均為 O(log n)

做法二:iterative - BFS

  1. 準備一個 stack 來放待 merge 的 node pairs
  2. 一次從裡面拿一個 pair 出來 merge, 同時也把該 merge 的子節點 pair 丟進去。一直做到 stack 裡面沒東西為止
  3. 因為這邊是 merge 到 root1, 故最後回傳 root1
    • 注意不要回傳到 p, 而是應該回傳當初的根節點 root1

Python3 solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 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
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if not root1 or not root2:
return root1 or root2
stack = [(root1, root2)]
while stack:
p, q = stack.pop() # 使用暫時的變數 p, q 來操作節點 merge
p.val += q.val
if not p.left and q.left:
p.left = q.left
elif p.left and q.left:
stack.append((p.left, q.left))
if not p.right and q.right:
p.right = q.right
elif p.right and q.right:
stack.append((p.right, q.right))
return root1

假設兩棵樹有較少節點的那顆有 n 個節點

  • 時間複雜度:O(n)
    • stack 裡會有 n 個 pairs, 所以會做 n 次
  • 空間複雜度:O(n)
    • 需要大小為 n 的 stack

評論

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×