做法一:recursive - DFS
找出最小的可重複動作:merge 兩個 nodes
- 題目給的 method 就可以用來做遞迴
假設
mergeTrees已完成,實作此最小可重複動作1
2
3
4root1.val += root2.val
root1.left = self.mergeTrees(root1.left, root2.left)
root1.right = self.mergeTrees(root1.right, root2.right)
return root1寫出遞迴的終止條件
1
2if not root1 or not root2:
return root1 or root2
Python3 solution:
1 | # Definition for a binary tree node. |
假設兩棵樹有較少節點的那顆有 n 個節點
- 時間複雜度:O(n)
- 空間複雜度:n 個節點那棵樹的深度
- 最差情況是 O(n), 平均為 O(log n)
做法二:iterative - BFS
- 準備一個 stack 來放待 merge 的 node pairs
- 一次從裡面拿一個 pair 出來 merge, 同時也把該 merge 的子節點 pair 丟進去。一直做到 stack 裡面沒東西為止
- 因為這邊是 merge 到 root1, 故最後回傳 root1
- 注意不要回傳到
p, 而是應該回傳當初的根節點 root1
- 注意不要回傳到
Python3 solution:
1 | # Definition for a binary tree node. |
假設兩棵樹有較少節點的那顆有 n 個節點
- 時間複雜度:O(n)
- stack 裡會有 n 個 pairs, 所以會做 n 次
- 空間複雜度:O(n)
- 需要大小為 n 的 stack