題目連結:
題目意譯:
給定兩個二元樹,並且現在想像一下當你將其中一棵樹覆蓋到另一棵上,兩棵樹彼此有些會因此互相重合,有些則不會。
你需要將這兩棵樹合併成一棵新的樹。合併的規則為:如果兩節點重疊了,則將兩節點之值加總即是重合後的新節點之值;反之,如果有非空節點遇到空節點,則直接將該非空節點作為新節點。
注:合併的過程應從兩棵樹各自的根節點開始。
範例測資:
輸入:
樹 1 樹 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
輸出
合併後的樹:
3
/ \
4 5
/ \ \
5 4 7
解題思維:
遞迴即可。
假設函式名為 MERGE,參數為 *t1 、 *t2 代表兩樹的根節點,則對於每次的遞迴:
我們先判斷 t1 與 t2 是否一醫者為空。如果是則不須繼續遞迴,直接回傳非空的那個節點。如果兩者皆空則回傳空(NULL)。
若以上皆非,則我們建立一個新的節點 *T ,其節點值為 t1 與 t2 的節點值之和。接著我們各自遞迴合併 t1 、 t2 的左子樹與右子樹,即 MERGE(t1->left, t2->left) 和 MERGE(t1->right, t2->right)。
並將兩次遞迴的回傳值分別賦予到 T->left 以及 T->right 儲存。然後回傳 T 。
此即可完成要求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。