当前位置: 首页 > news >正文

面试算法50:向下的路径节点值之和

题目

给定一棵二叉树和一个值sum,求二叉树中节点值之和等于sum的路径的数目。路径的定义为二叉树中顺着指向子节点的指针向下移动所经过的节点,但不一定从根节点开始,也不一定到叶节点结束。例如,在如图8.5所示中的二叉树中有两条路径的节点值之和等于8,其中,第1条路径从节点5开始经过节点2到达节点1,第2条路径从节点2开始到节点6。
在这里插入图片描述

分析

虽然路径不一定从根节点开始,但仍然可以求得从根节点开始到达当前遍历节点的路径所经过的节点值之和。

如果在路径上移动时把所有累加的节点值之和都保存下来,然后移动的过程中求差值,就容易知道是否存在从任意节点出发的值为给定sum的路径。

有了前面的经验,就可以采用二叉树深度优先搜索来解决与路径相关的问题。当遍历到一个节点时,先累加从根节点开始的路径上的节点值之和,再计算到它的左右子节点的路径的节点值之和。这就是典型的前序遍历的顺序。

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;}
}
http://www.lryc.cn/news/215827.html

相关文章:

  • dbeaver查看表,解决证书报错current license is non-compliant for [jdbc]
  • 网络安全进阶学习第二十一课——XXE
  • 如何将 ruby 打包类似于jdk在另一台相同架构的机器上面开箱即用
  • vue封装独立组件:实现分格密码输入框/验证码输入框
  • 从2D圆形到3D椭圆
  • Linux CentOS7.9安装OpenJDK17
  • 计算机网络第4章-网络层(1)
  • 单元测试学习
  • python编写接口测试文档(以豆瓣搜索为例)
  • C++查看Class类结构
  • appium如何连接多台设备
  • VUE el-form组件不绑定model时进行校验
  • 计算机视觉的监督学习与无监督学习
  • Linux-lvds接口
  • Android 自定义View一
  • 11、电路综合-集总参数电路结构的S参数模型计算与Matlab
  • 计算机网络--真题
  • java毕业设计基于ssm的招聘求职网站
  • 【JavaEE初阶】 初识网络原理
  • LeetCode题解:993. 二叉树的堂兄弟节点,BFS,JavaScript,详细注释
  • 在python中加载tensorflow-probability模块和numpy模块
  • t2017递推2猴子摘桃
  • 呼吸灯【FPGA】
  • Codeforces 1855E 数学期望 + DP
  • 5-1CComplex运算符重载为友元
  • Vue3.0 watch和watchEffect监听器:VCA
  • 1360. 日期之间隔几天
  • ubuntu配置 Conda 更改默认环境路径
  • 华山编程培训中心——工业相机飞拍
  • linux 释放缓存命令并做成定时任务