タイトルの説明
ルートノードとバイナリツリーの整数を入力し、バイナリツリーのノード値の合計が入力整数であるすべてのパスを出力します。パスは、ツリーのルートノードから始まり、リーフノードに至るパスとして定義されます。(注:戻り値のリストでは、配列の長さが最大の配列が一番上にあります)
アイデア:問題は整数に一致する戻り値を出力することであるため、ツリートラバーサルを伴う必要があります。ルートノードから各ノードへのパスの合計です。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); 解像度を返す; } };