小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
437. 路径总和 III
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
思路分析
先用最简单的方法——穷举,遍历每个节点,对于每个节点使用深度优先遍历不断使数字接近targetSum。
一个最简单的dfs十分的容易构建
int dfs(TreeNode* root, int targetSum) {
if (!root) {
return 0;
}
int ret = 0;
if (root->val == targetSum) ret++;
ret += dfs(root->left, targetSum - root->val);
ret += dfs(root->right, targetSum - root->val);
return ret;
}
不过单纯的使用一次dfs只能让我们算出一个根结点下面有几种可能,因此我们需要不断遍历其他节点得到总数,当然这个过程也可以使用dfs进行实现,
第二个dfs和第一个大同小异,这里就不赘述了,不过我们注意到,当targetSum变为负数的时候,这个程序依旧会运行下去,因此我们可以在此基础上用限制targetSum值的方式为我们的dfs进行剪枝,从而大大提高我们计算速度。