ソードフィンガーオファー:二分木の中和は価値のある道です

タイトルの説明

ルートノードとバイナリツリーの整数を入力し、バイナリツリーのノード値の合計が入力整数であるすべてのパスを出力します。パスは、ツリーのルートノードから始まり、リーフノードに至るパスとして定義されます。(注:戻り値のリストでは、配列の長さが最大の配列が一番上にあります)
 
アイデア:問題は整数に一致する戻り値を出力することであるため、ツリートラバーサルを伴う必要があります。ルートノードから各ノードへのパスの合計です。DFSについて考えてください。
アルゴリズムが来ると、各再帰は、現在のターゲット値がゼロであるかどうか、および左と右のサブツリーがすべて空(リーフノード)かどうかを決定するだけでよく、それが満たされる場合は、配列を追加して再帰します。
最後の子ノードが満たされていない場合、もちろんpop_backは、リーフノードでないときに現在のノード値が満たされた可能性があります。このとき、条件が満たされていない場合は、続行します。
葉ノードまで再帰的に続行すると、ターゲットがターゲットと一致した場合にのみ、ターゲットを配列に追加できます。
 
コード:
/ * 
struct TreeNode { 
    int val; 
    struct TreeNode *左; 
    struct TreeNode * right; 
    TreeNode(int x):
            val(x)、left(NULL)、right(NULL){ 
    } 
}; * / 
クラスSolution {
 public 
    vector <vector < int >> res; 
    ベクトル < int > パス;
    void find(TreeNode * root、int sum){
         if(root == nullptr)return ; 
        path.push_back(root- > val); 
        合計 -=ルート->val;
        if(sum == 0 &&!root->左&&!root- > 右)res.push_back(path); if
        else {
             if(root-> left)find(root-> left、sum);
            if(root-> right)find(root-> right、sum); 
        } 
        path.pop_back(); 
    } 
    vector <vector < int >> FindPath(TreeNode * root、int expectNumber){ 
        find(root、expectNumber); 
        解像度を返す; 
    } 
};

 

おすすめ

転載: www.cnblogs.com/BillowJ/p/12730235.html