題目連結:
題目意譯:
竊賊又找到了一塊新的地區來竊盜。此區域只有一個入口,此稱為 root。
除了 root 以外,每間房子只有唯一一間作為「父節點」的房子。逛了一下這個區域後,聰明的竊賊意識到這區域中所有房子形成了一棵二元樹。如果兩間直接鏈結的房子在同一晚同時被闖入的話,將會通知警察。
給定二元樹的根節點 root,回傳一晚內在不驚動警察的狀況下,竊賊可以搶得的最大金額為何。
限制:
樹中的節點數量位於範圍 [1, 10 ^ 4] 中。
0 ≦ Node.val ≦ 10 ^ 4
範例測資:
範例 1:
輸入: root = [3,2,3,null,3,null,1]
輸出: 7
解釋: 竊賊能搶得最大金額 = 3 + 3 + 1 = 7。
範例 2:
輸入: root = [3,4,5,1,3,null,1]
輸出: 9
解釋: 竊賊能搶得最大金額 = 4 + 5 = 9。
解題思維:
定義 DX 為只考慮節點 X 下形成的子樹且在必須搶節點 X 能搶得的金額最大值;而 RX 為只考慮節點 X 下形成的子樹且在不得搶節點 X 能搶得的金額最大值。因此可以看到所求為 max(Droot, Rroot)。
假設節點 X 的左子小孩為 X->left 且其右下小孩為 X-right。因此可以看到遞迴式為
DX = RX->left+ RX->right + 節點 X 之值;
RX = max(DX->left, RX->left) + max(DX->right, RX->right)。
至於計算的順序可以單純地遞迴即可(當然,想要從葉節點往上推回到 root 也是可以的)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。