Easy
617. Merge Two Binary Trees
treedepth-first-searchbreadth-first-searchbinary-tree
解題說明
Merge Two Binary Trees
題目描述:給定兩棵二元樹 root1 和 root2,將它們合併成一棵新的二元樹。合併規則是:若兩棵樹的對應節點都存在,新節點的值為兩者之和;若其中一棵樹的節點為空,新樹使用另一棵樹的節點。
解題思路:使用遞迴同時遍歷兩棵樹。對於每個位置:
- 若兩棵樹的對應節點都為空,回傳 null。
- 若其中一棵為空,直接回傳另一棵的節點。
- 若都不為空,將值相加存入
root1(原地修改),然後遞迴處理左右子樹。
這種方法直接修改 root1,不需要額外建立新節點。
C++ 解法
複雜度分析
時間複雜度:O(min(m, n)) — m 和 n 分別為兩棵樹的節點數,只需遍歷兩棵樹重疊的部分。
空間複雜度:O(min(m, n)) — 遞迴深度取決於較小的樹的高度,最壞情況為 O(min(m, n))。
虛擬碼
1. If root1 is null, return root2 2. If root2 is null, return root1 3. root1.val += root2.val 4. root1.left = mergeTrees(root1.left, root2.left) 5. root1.right = mergeTrees(root1.right, root2.right) 6. Return root1
其他解法
建立新樹:不修改原樹,每次建立新的 TreeNode。時間空間複雜度相同,但不會破壞輸入資料,適合需要保留原樹的場景。
迭代法(BFS):用佇列同時遍歷兩棵樹的對應節點。時間複雜度 O(min(m, n)),空間複雜度 O(min(m, n))。適合樹很深但不想使用遞迴的場景。
延伸思考
- 如果不允許修改原始樹,該如何修改演算法?
- 如果要合併 k 棵二元樹呢?時間複雜度會如何變化?
- 若兩棵樹的合併規則改為取最大值而非相加,程式碼需要做什麼修改?