递归思考的方法是考虑案例。在我们的例子中,我们查看单个节点并可以决定它有哪些路径:
- 如果节点没有子节点,则唯一的路径是单例路径(由该节点本身组成)。
- 如果节点只有一个子节点,则所有路径都通过该子节点。
- 否则,该节点有两个孩子。然后,所有路径都通过它的两个孩子之一。
在情况 1 中,最大值必须是该节点的值。在情况 2 中,最大值是该节点的值,加上其子节点的最大路径和(因为该路径通过唯一的子节点扩展到父节点的路径)。在情况 3 中,最大值是它的两个孩子的最大 max-path-sum(因为最好的路径必须经过两个孩子中的一个,并且父母可以看到孩子的最佳路径中哪一个更好)。
因此,代码非常简单。在这里,由于您返回一个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());
}