Leetcode 437 Path Sum III

博客围绕Leetcode 437. Path Sum III题目展开,题目要求找出二叉树中路径和为给定值的路径数量,路径无需从根节点或叶子节点开始或结束。解题思路是任意节点可作为根节点向下遍历,介绍了pathSum和count两个递归函数的作用及区别。

题目链接:437. Path Sum III

题目描述

You are given a binary tree in which each node contains an integer value.

Find the number of paths that sum to a given value.

The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes).

The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000.

简而言之,任意一个结点到其任意一个子结点的路径和为SUM,有多少个

Example:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

Return 3. The paths that sum to 8 are:

1.  5 -> 3
2.  5 -> 2 -> 1
3. -3 -> 11

解题思路

任意一个结点都可以当根节点,然后向下进行遍历,找寻是否存在路径和为SUM的结点。

而且条件仅限 路径和==sum,并不一定非得到叶子结点。

在参考优秀答案的时候,看到了一位老哥对递归的诠释:特此分享Leetcode

Leetcode讨论区,用户ID:fudonglai

写递归的技巧是:明白一个函数的作用并相信它能完成这个任务,千万不要跳进这个函数里面企图探究更多细节,否则就会陷入无穷的细节无法自拔。你就算浑身是铁,能压几个栈?

按照前面说的技巧,先来定义清楚每个递归函数应该做的事:
pathSum 函数:给他一个节点和一个目标值,他返回以这个节点为根的树中,和为目标值的路径总数。
count 函数:给他一个节点和一个目标值,他返回以这个节点为根的树中,能凑出几个以该节点为路径开头,和为目标值的路径总数

pathSum 和 count的区别是,count只计算以该结点为开始结点的总数目。

而pathSum,是计算以该节点为根,那么包含了该根节点下 各个结点的count。

/* 有了以上铺垫,详细注释一下代码 */
int pathSum(TreeNode root, int sum) {
    if (root == null) return 0;
    int pathImLeading = count(root, sum); // 自己为开头的路径数
    int leftPathSum = pathSum(root.left, sum); // 左边路径总数(相信他能算出来)
    int rightPathSum = pathSum(root.right, sum); // 右边路径总数(相信他能算出来)
    return leftPathSum + rightPathSum + pathImLeading;
}
int count(TreeNode node, int sum) {
    if (node == null) return 0;
    // 我自己能不能独当一面,作为一条单独的路径呢?
    int isMe = (node.val == sum) ? 1 : 0;
    // 左边的小老弟,你那边能凑几个 sum - node.val 呀?
    int leftBrother = count(node.left, sum - node.val); 
    // 右边的小老弟,你那边能凑几个 sum - node.val 呀?
    int rightBrother = count(node.right, sum - node.val);
    return  isMe + leftBrother + rightBrother; // 我这能凑这么多个
【源码免费下载链接】:https://renmaiwang.cn/s/nhrcw 深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法,它选择一个节点并尽可能深地探索其分支。在迷宫生成中,DFS被用来创建复杂的路径结构。以下是对给定内容的详细解释:1. **Python深度优先算法生成迷宫的原理**: 迷宫生成的基本思想是随机地在空白区域添加墙壁,形成一条可以从起点到终点的路径。DFS在这里的作用是从起始点开始,随机选择一个方向进行移动,并将该路径标记为已访问。当遇到障碍(已存在的墙壁)或者到达终点时,算法回溯到上一步,选择其他未尝试过的路径。2. **代码解析**: - 定义矩阵`dfs`来记录迷宫中每个单元格是否已被访问。 - 定义矩阵`maze`来表示最终生成的迷宫,其中`#`代表墙壁,空格代表可通行路径。 - `operation`字典存储了四个可能的方向(上、下、左、右)对应的坐标偏移量。 - `direction`列表包含所有可能的方向,用于随机选择移动方向。 - `stack`用于存储深度优先搜索过程中的路径。3. **函数说明**: - `show(graph)`:打印迷宫矩阵,便于观察迷宫结构。 - `showRouter(stack)`:打印DFS过程中访问的路径,展示从起点到终点的路径。 - `generateMaze(start)`:核心函数,使用DFS生成迷宫。首先将起始点标记为已访问,然后随机排序方向,依次尝试这些方向,如果新位置未被访问且在有效范围内,则打通墙壁并递归调用自身。4. **迷宫生成流程**: - 创建一个全墙的初始迷宫矩阵,奇数行和奇数列的位置代表实际的墙壁,偶数位置代表路径。 - 起点设为`(0, 0)`,调用`generateMaze((0,0))`开始生成迷宫。 - 在递归过程中,每次
内容概要:本文设计并实现了一个基于ZigBee无线传感器网络的火焰采集系统,旨在通过无线传感技术实现对监测区域火灾的实时检测与远程报警。系统由ZigBee火焰传感器节点、网关模块和远程通信终端(手机)组成,利用CC2530芯片和Z-Stack协议栈完成数据采集、无线传输与网络组网。传感器节点采集火焰信号后,通过ZigBee网络发送至网关,网关再通过GPRS将信息传输至手机端,实现远程监控。文中详细阐述了系统架构、需求分析、硬件电气原理图设计(包括感知节点与网关)、ZigBee协议栈开发、串口通信机制及节点入网流程,完成了驱动程序与通信协议的设计与调试。系统具备低功耗、高可靠性、自组织组网等特点,适用于古建筑、旧楼宇等场景的火灾预警。; 适合人群:具备嵌入式系统、无线通信基础知识的高校物联网、电子信息类专业学生或初级工程技术人员,熟悉C语言及基本电路设计者更佳;适合参与课程设计、毕业设计或从事无线传感网络开发的技术人员参考。; 使用场景及目标:①用于室内或复杂环境中火灾的早期监测与自动报警;②作为物联网与无线传感器网络的教学实践项目,掌握ZigBee协议栈、传感器驱动、串口通信、网络拓扑构建等核心技术;③为智慧消防、智能家居等应用场景提供低成本、易部署的技术方案原型。; 阅读建议:建议结合ZigBee实验箱与IAR开发环境同步实践,重点关注协议栈事件处理机制、串口与无线数据转发逻辑、节点入网流程的代码实现,配合电气原理图理解硬件连接关系,调试过程中注意信道选择、PAN ID设置与数据帧格式校验,以提升系统稳定性与通信可靠性。
【源码免费下载链接】:https://renmaiwang.cn/s/rbkv9 在计算机科学和技术领域中,计算机网络是不可或缺的一环,其实践性教学环节是掌握该学科核心知识的重要途径。华中科技大学的《计算机网络实验详解》课程为学生提供了全面而系统的动手实践机会,涵盖了socket连接建立、可靠数据传输机制设计和CPT(Cisco Packet Tracer)网络模拟与构建等关键实验项目。这些实践内容不仅强化了学生的编程能力,还帮助其深入理解了网络通信的基本原理及其在实际应用中的具体实现方式。通过 socket连接建立实验,学生能够掌握进程间通信的核心技术,并利用socket接口完成客户端与服务器端之间的信息交互。具体而言,该过程包括socket对象创建、绑定IP地址和端口号、监听连接请求、接受连接建立以及数据传输等步骤。这些实践环节让学生深入理解了TCP/IP协议族的工作机制及其在现代网络体系中的重要地位。此外,通过可靠数据传输实验,学生得以探索如何在不稳定的网络环境下确保数据完整性这一技术难点。互联网的特殊性质导致数据可能经历丢失、重复或顺序错误等问题,因此设计和实现一套完善的传输可靠性机制成为课程的重点内容。该部分实践涉及滑动窗口协议、停等协议以及自动重传请求(ARQ)等关键技术,这些方法均建立在经典的TCP协议之上,并通过实验验证了其在提高数据传输可靠性的有效性。最后,CPT组网实验为学生提供了一个模拟真实网络环境的平台,在此环境中他们可以搭建路由器和交换机设备、配置IP地址并设计路由策略,从而实现网络的互联互通。通过这一系列实践环节,学生不仅能够巩固理论知识,还能够在实际操作中掌握网络设备的配置与管理技能。综合来看,《计算机网络实验详解》课程通过 socket连接建立、可靠数据传输机制设计和CPT组网等三大模块的学习,为学生构建了扎实的专业基础,并为其未来从事网络相
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值