ETH官方钱包

前往
大廳
主題

LeetCode - 2641. Cousins in Binary Tree II 解題心得

Not In My Back Yard | 2024-06-18 12:00:01 | 巴幣 0 | 人氣 94

題目連結:


題目意譯:
給定一棵二元樹的根節點 root,將樹中每一個節點的數值替換成其所有「表節點」之數值總和。

一棵二元樹中的兩個節點如果有著相同的深度但父母節點不同時,則兩者互為表節點。

回傳修改後的樹之根節點。

注意到一個節點的深度為從根節點到該節點的路徑上之邊數。
 
限制:
樹中的節點數位於範圍 [1, 10 ^ 5] 中。
1 ≦ Node.val ≦ 10 ^ 4



範例測資:
範例 1:
輸入: root = [5,4,9,1,10,null,7]
輸出: [0,0,0,7,7,null,11]
解釋: 上圖表示了一開始的二元樹以及改變每個節點數值後的二元樹。
- 數值為 5 的節點沒有表節點,所以總和為 0。
- 數值為 4 的節點沒有表節點,所以總和為 0。
- 數值為 9 的節點沒有表節點,所以總和為 0。
- 數值為 1 的節點有一個數值為 7 的表節點,所以總和為 7。
- 數值為 10 的節點有一個數值為 7 的表節點,所以總和為 7。
- 數值為 10 的節點有一個數值為 1 和一個數值為 10 的表節點,所以總和為 11。

範例 2:
輸入: root = [3,1,2]
輸出: [0,0,0]
解釋: 上圖表示了一開始的二元樹以及改變每個節點數值後的二元樹。
- 數值為 3 的節點沒有表節點,所以總和為 0。
- 數值為 1 的節點沒有表節點,所以總和為 0。
- 數值為 2 的節點沒有表節點,所以總和為 0。


解題思維:
根據題目的表節點定義,我們一次看所有同一個深度的節點會比較方便。因此我們可以使用階層探訪(Level-Order Traversal),參見這題

那實際上同一層的節點各自有沒有表節點存在的這個資訊本身要怎麼獲得呢?很單純,只要不是與自己有同一個父母節點的其他節點(下稱姊妹節點)就是表節點。

因此可以看到我們從某一層推到下一層時,可以順便把下一層的總和 S 以及每一個節點有沒有姊妹節點存在之資訊儲存起來。

而在下一層時,我們只要先判斷每一個節點有沒有姊妹節點(令自己的值為 x)。如果有,則自己和姊妹節點都改變成 S - x - y,其中 y 為姊妹節點之值;反之,則將自身的值改為 S - x。

每一層都掃過之後便可以得到所求的二元樹。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作