1.トピックの紹介
バイナリツリーが与えられると、各ノードには整数値が含まれます(値は正または負のいずれかです)。ノード値の合計が指定された値に等しいすべてのパスの数を出力するアルゴリズムを設計します。パスは必ずしもバイナリツリーのルートノードまたはリーフノードから開始または終了する必要はありませんが、その方向は下向きである必要があります(親ノードから子ノードへのみ)。
例:
次のバイナリツリーがあり、目標の合計が22の場合
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
戻り値:
3
説明:合計が22のパスは、[5,4,11,2]、[5,8,4,5]、[4,11,7]です。
ヒント:
ノードの総数<= 10000
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/paths-with-sum-lcci
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2つの問題解決のアイデア
この質問では、2層DFSを使用して検索し、最終的に要件を満たすすべてのパスの数を見つけます。詳細については、コードを参照してください。
3つの問題解決コード
class Solution {
public:
int res = 0;
int pathSum(TreeNode* root, int sum) {
if(!root)
return res;
dfs(root, sum); //计算以根节点为起点时,所得结果
pathSum(root->left, sum); //计算以左子节点为起点时,所得结果
pathSum(root->right, sum);//计算以右子节点为起点时,所得结果
return res;
}
void dfs(TreeNode* root, int sum)
{
if(!root)
return;
int curNum = root->val;
if(curNum == sum) res++;
dfs(root->left, sum-curNum);
dfs(root->right, sum-curNum);
}
};