件名の説明:
二分木、整数値が格納されている各ノードを与えられました。
パスの総数は、パスを検索し、指定された値に等しくされます。
パスがルートから始まる必要としない、リーフノードで終了する必要はありませんが、パスの方向が(子ノードへの親からのみのノード)ダウンしなければなりません。
いいえ1000個の以上のバイナリツリーノード、およびノードの値の範囲は[-1000000,1000000]整数ではありません。
アイデアの分析:(から問題解決https://leetcode-cn.com/problems/path-sum-iii/solution/leetcode-437-path-sum-iii-by-li-xin-lei/)
パスの先頭はリーフノードの終わりではないかもしれない、ルート・ノードではないかもしれないが、それは少し複雑ではありませんか?
問題は、この場合には:スタートとして、ルート・ノードを見つけるために、任意のノードがエンドとして使用することができ、かつパス上の多数のノードとパスの和、
ではありませんバイナリツリーの前トラバーサルはすべてこのパスを乗り越えることができますか?はい、
この問題は解決されている場合、元の問題は、問題の複数に分解することができ、
同じ問題がいくつかのセグメントされていないが、バイナリツリーにセグメント、
後根ノードへのすべてのパスの決済において、左とパスを開始するために、すべての子どもの権利のルートに子を見つけるために、3つのノードは、再帰構造を構成します。
コードの実装:
/ ** *バイナリツリーノード定義のA。 *パブリッククラスツリーノード{ * INTヴァル; *ツリーノード左; *ツリーノード右; *ツリーノード(INT X){X =ヴァル;} *} * / クラスソリューション{ / ** *二分木のルートのためのルートを求め、合計のためのすべてのパス; *パスの始まりは、リーフノードの端必ずしも、必ずしもルートない; * @paramルート * @param和 * @return * / パブリックINT pathSum(ルートツリーノード、INT SUM){ IF(ルート== NULL){ 戻り0; } パスを返す(ルート、SUM) } + pathSum(root.left、SUM) + pathSum(root.right、合計)。 プライベートint型のパス(ツリーノードのルート、INT合計){ IF(ルート== NULL){ 戻り0; } INT RES = 0。 IF(root.val ==合計){ RES + = 1; } RES + =パス(root.left、和- root.val)。 RES + =パス(root.right、和- root.val)。 解像度を返します。 } }