题目
给定一棵二叉树和一个值sum,求二叉树中节点值之和等于sum的路径的数目。路径的定义为二叉树中顺着指向子节点的指针向下移动所经过的节点,但不一定从根节点开始,也不一定到叶节点结束。例如,在如图8.5所示中的二叉树中有两条路径的节点值之和等于8,其中,第1条路径从节点5开始经过节点2到达节点1,第2条路径从节点2开始到节点6。
分析
虽然路径不一定从根节点开始,但仍然可以求得从根节点开始到达当前遍历节点的路径所经过的节点值之和。
如果在路径上移动时把所有累加的节点值之和都保存下来,然后移动的过程中求差值,就容易知道是否存在从任意节点出发的值为给定sum的路径。文章来源:https://www.toymoban.com/news/detail-742691.html
有了前面的经验,就可以采用二叉树深度优先搜索来解决与路径相关的问题。当遍历到一个节点时,先累加从根节点开始的路径上的节点值之和,再计算到它的左右子节点的路径的节点值之和。这就是典型的前序遍历的顺序。文章来源地址https://www.toymoban.com/news/detail-742691.html
解
public class Test {
public static void main(String[] args) {
TreeNode node5 = new TreeNode(5);
TreeNode node2 = new TreeNode(2);
TreeNode node4 = new TreeNode(4);
TreeNode node1 = new TreeNode(1);
TreeNode node6 = new TreeNode(6);
TreeNode node3 = new TreeNode(3);
TreeNode node7 = new TreeNode(7);
node5.left = node2;
node5.right = node4;
node2.left = node1;
node2.right = node6;
node4.left = node3;
node4.right = node7;
int result = pathSum(node5, 8);
System.out.println(result);
}
public static int pathSum(TreeNode root, int sum) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);// 节点和为0的路径有一个(空路径)
// path: 遍历节点的路径和
return dfs(root, sum, map, 0);
}
private static int dfs(TreeNode root, int sum, Map<Integer, Integer> map, int path) {
if (root == null) {
return 0;
}
// 前序遍历
path += root.val;
int count = map.getOrDefault(path - sum, 0);// 深度优先遍历,如果以前存在这个差值,那么和当前路径一定是以前路径的延伸
map.put(path, map.getOrDefault(path, 0) + 1);
count += dfs(root.left, sum, map, path);
count += dfs(root.right, sum, map, path);
// 当前这个节点遍历完成,重回当前节点的父节点继续遍历。
map.put(path, map.get(path) - 1);
return count;
}
}
到了这里,关于面试算法50:向下的路径节点值之和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!