遞歸思考的方法是考慮這些情況。在我們的例子中,我們看一個單一的節點,並且可以決定有什麼樣的路徑:
- 如果該節點沒有孩子,那麼唯一的路徑是單路徑(本身由該節點的)。
- 如果該節點只有一個孩子,則所有路徑都會經過該孩子。
- 否則,節點有兩個孩子。然後,所有路徑都通過其兩個孩子中的一個。
在情況1中,最大值必須是該節點的值。在情況2中,最大值是該節點的值,加上其子的最大路徑總和(因爲該路徑通過唯一的子節點擴展到父路徑)。在情況3中,最大值是其兩個孩子的最大路徑總和(因爲最佳路徑必須通過兩個孩子中的一個,並且父母可以看到哪個孩子的最佳路徑更好)。
因此,代碼非常簡單。在這裏,由於您返回int
,因此我將假設T = int
。
public int maxSum() {
/* case 1 */
if(left == null && right == null)
return data;
/* case 2 */
if(right == null)
return data + left.maxSum();
else if(left == null)
return data + right.maxSum();
/* case 3 */
return Math.max(data + left.maxSum(), data + right.maxSum());
}
你嘗試過什麼了嗎?如果是這樣,你嘗試了什麼?如果不是,什麼阻止你嘗試? – nneonneo
也請記住,泛型可能不具有可比性。您應該使用'T extends Comparable'來確保類型具有可比性。 – nneonneo
我想過要經過樹中的每一條路徑,然後讓它跟蹤最大的一條路徑,但我不確定我會怎麼做,因爲這個方法是遞歸的。 – user1547050