Leetcode 437タイトル:総経路III(再帰 - シンプル)

件名の説明:

二分木、整数値が格納されている各ノードを与えられました。

パスの総数は、パスを検索し、指定された値に等しくされます。

パスがルートから始まる必要としない、リーフノードで終了する必要はありませんが、パスの方向が(子ノードへの親からのみのノード)ダウンしなければなりません。

いいえ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)。
        
        解像度を返します。
    } 
}
時間計算量:O(n)は、nはツリーのノードの数。
空間複雑:O(h)は、hは木の高さです。

おすすめ

転載: www.cnblogs.com/ysw-go/p/12033847.html