我在尝试理解代码中解决路径总和问题的逻辑。这是Gayle Laakmann McDowell的书中已经解决的问题,尽管我的代码看起来有些不同。
问题:给定一棵二叉树,每个节点包含一个整数值,计算所有(向下)路径的数量,它们的和为目标值。
代码:
private Map<Integer, Integer> map = new HashMap<>();
private int count = 0;
private int pathSum(BinaryTreeNode root, int tgtSum)
{
map.put(0, 1);
pathSum(root, 0, tgtSum);
return count;
}
private void pathSum(BinaryTreeNode root, int runningSum, int tgtSum)
{
if (root == null) return;
runningSum += root.data;
if (map.containsKey(runningSum - tgtSum))
{
count += map.get(runningSum - tgtSum);
}
if (map.containsKey(runningSum))
{
map.put(runningSum, map.get(runningSum) + 1);
}
else
{
map.put(runningSum, 1);
}
pathSum(root.left, runningSum, tgtSum);
pathSum(root.right, runningSum, tgtSum);
map.put(runningSum, map.get(runningSum) - 1);
}
我的问题:
我有点理解在地图中将runningSum
存储为键的逻辑,以及如果某些连续节点加起来等于tgtSum
,那么(runningSum - tgtSum)
的值必须存在于地图中作为其中一个键的价值,因为该差异将是其他节点的runningSum
。
我不明白的是,为什么我们不能用count++
替换count += map.get(runningSum - tgtSum)
?
我尝试进行调试,我可以看到,在某些情况下,如果同一分支具有多个连续节点加起来等于tgtSum
,则使用count++
仅计算一次,而使用地图中存储的频率上述方式给出了正确的输出。
尽管我在花时间调试后成功了,但我无法将更新变量count
的这部分逻辑与使用runningSum
作为键和该运行总和的频率作为值的地图的基本逻辑联系起来。
有人能简化并解释吗?