再帰的に考える方法は、ケースを検討することです。この例では、単一のノードを調べて、そのノードが持つパスを決定できます。
- ノードに子がない場合、唯一のパスはシングルトンパスです(そのノード自体で構成されます)。
- ノードに子が1つしかない場合、すべてのパスがその子を通過します。
- それ以外の場合、ノードには2つの子があります。次に、すべてのパスが2つの子のうちの1つを通過します。
ケース1の場合、最大値はそのノードの値でなければなりません。ケース2の場合、最大値はそのノードの値に、その子のmax-path-sumを加えたものです(そのパスは、唯一の子を介して親のパスに拡張されるため)。ケース3の場合、最大値は2つの子の最大max-path-sumです(最適なパスは2つの子の1つを通過する必要があり、親は子の最適なパスのどちらが優れているかを確認できるため)。
したがって、コードは本当に単純です。ここでは、を返すので、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());
}