タイトルの説明
ヒールノードとバイナリツリーの整数を入力し、バイナリツリーのノード値の合計が入力整数であるすべてのパスを出力します。パスは、ツリーのルートノードから始まり、リーフノードに至るパスとして定義されます。
問題解決のアイデア
パスの合計が必要な場合、必然的な終了条件はリーフノードであり、ルートノードから左から右に向かって、各パスの合計が指定された値と比較されます。
しかし、多くの場合、二分木の問題はそれ自体が二分木である再帰を使用し、法則を見つけた場合、サブツリーは二分木でなければなりませんか??
このように考えると、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;
}
};