【刀指募集】_10二分木和はある道のり値

タイトルの説明

ヒールノードとバイナリツリーの整数を入力し、バイナリツリーのノード値の合計が入力整数であるすべてのパスを出力します。パスは、ツリーのルートノードから始まり、リーフノードに至るパスとして定義されます。

問題解決のアイデア

パスの合計が必要な場合、必然的な終了条件はリーフノードであり、ルートノードから左から右に向かって、各パスの合計が指定された値と比較されます。
しかし、多くの場合、二分木の問題はそれ自体が二分木である再帰を使用し、法則を見つけた場合、サブツリーは二分木でなければなりませんか?
このように考えると、1回再帰的になり、古いコールシステムスタックはデータを1回保存します。パス上のすべてのノードの合計は指定された値に等しいため、指定された値からパスを引いた合計が0に等しいことを意味します現在のルートノードの値が再帰的にリーフノードまで減算されるたびに、最後の値がリーフノードの値と等しい場合、この問題を解決できると考えるのは難しくありません
バイナリツリーにノードが1つしかなく、そのノードの値が指定された値と等しい場合は、特別なケースを考慮する必要があります。したがって、現在のルートノードの値を毎回減算する前に、まずそれらが等しいかどうかを判断し、次にを減算します。
葉ノードが等しくない場合は、上に移動してから右に移動します
上記のアイデアで、次のコードを書くことは難しくありません

コードの実装

class Solution {
    vector<vector<int>> result;
    vector<int>  path;
public:
    void find(TreeNode* root,int expectnum)
    {
        if(root == NULL)
            return ;
        path.push_back(root->val);
        if(!root->left&&!root->right&& expectnum == root->val)
            result.push_back(path);
        else
        {
            if(root->left)
                find(root->left,expectnum-root->val);
            if(root->right)
                find(root->right,expectnum-root->val);
        }
        path.pop_back();
    }
    
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        find(root,expectNumber);
        return result;
    }
};
253件の元の記事を公開しました 賞賛されました41 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/liuyuchen282828/article/details/103767558