前往
大廳
主題

LeetCode - 563. Binary Tree Tilt 解題心得

Not In My Back Yard | 2020-11-19 00:02:32 | 巴幣 0 | 人氣 235

題目連結:


題目意譯:
給定一棵二元樹的根節點,回傳每個節點的「傾度」之總和。

一個樹的節點之「傾度」定義為左子樹節點值總和與右子樹節點值總和之差值絕對值。如果有節點不存在左子樹,則左子樹節點值總和視為 0 。右子樹同理。

限制:
樹中的節點總數坐落於 [0, 10 ^ 4] 的範圍中。
-1000 ≦ Node.val ≦ 1000



範例測資:
範例 1:
輸入: root = [1,2,3]
輸出: 1
解釋:
節點 2 的傾度: |0-0| = 0 (沒有任何子節點)
節點 3 的傾度: |0-0| = 0 (沒有任何子節點)
節點 21的傾度: |2-3| = 1 (左子樹只是單一個子節點,所以總和為 2;右子樹只是單一個子節點,所以總和為 3)
傾度總和:0 + 0 + 1 = 1。

範例 2:
輸入: root = [4,2,9,3,5,null,7]
輸出: 15
解釋:
Tilt of node 3 : |0-0| = 0 (沒有任何子節點)
Tilt of node 5 : |0-0| = 0 (沒有任何子節點)
Tilt of node 7 : |0-0| = 0 (沒有任何子節點)
Tilt of node 2 : |3-5| = 2 (左子樹只是單一個子節點,所以總和為 3;右子樹只是單一個子節點,所以總和為 5)
Tilt of node 9 : |0-7| = 7 (沒有左側的子節點,所以總和為 0;右子樹只是單一個子節點,所以總和為 5)
Tilt of node 4 : |(3+5+2)-(9+7)| = |10-16| = 6 (左子樹之值為 3 、 5 和 2 ,所以總和為 10;右子樹為 9 和 7 ,總和為 16)
傾度總和:0 + 0 + 0 + 2 + 7 + 6 = 15

範例 3:
輸入: root = [21,7,14,1,1,2,2,3,3]
輸出: 9


解題思維:
一棵樹的節點值總和 = 根節點之值 + 左子樹節點值總和 + 右子樹節點值總和。我們可以按照此方式遞迴求得左子樹、右子樹的節點值總合。

且對於每棵子樹,當我們從更深處的遞迴回來而求得兩個子樹的節點和時,即可計算出對於此樹根節點的傾度。因此,我們只需要遍歷整棵樹一次即可求出所有節點的傾度,而全數相加即是所求。




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

創作回應

更多創作