112.path-sum

给定一棵二叉树和一个总和,确定该树中是否存在根到叶的路径,这条路径的所有值相加等于给定的总和。

例如:
给定下面的二叉树和 总和 = 22

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1

返回 true, 因为存在总和为 22 的根到叶的路径 5->4->11->2


解题思路:

    从左往右搜索到最深处即可


解题代码:

from collections import deque
class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if root:
            queue = deque([(root, root.val)])
            while queue:
                p, s = queue.popleft()
                left, right = p.left, p.right
                if left:
                    queue.append((p.left, s + p.left.val))
                if right:
                    queue.append((p.right, s + p.right.val))
                if not left and not right and s == sum:
                    return True
            return False
        return False
注意:判断条件的地方只能用right和left,不能为p.left or p.right
### C语言递归函数 `add` 的逻辑错误分析与 VSCode 调试配置解决方案 #### 1. C语言递归函数 `add` 的逻辑错误分析 在C语言中,递归函数的设计需要满足两个基本条件:一是明确的递归终止条件;二是每次递归调用应逐步接近终止条件。如果这两个条件未能得到充分考虑,则可能导致程序运行异常或无法输出预期结果。 ##### (1)递归终止条件不足 当前递归函数 `add` 存在一个明显的逻辑问题,即其递归终止条件不够严谨。具体表现为: - 在原始实现中,`sum--` 是非法操作,因为它是赋值表达式的一部分,而非独立的操作[^3]。 - 此外,即使忽略语法错误,`add(sum--)` 并不会改变实参的实际值,而是传递副本进行递归调用,这使得递归永远不会到达基线条件[^4]。 修正后的递归函数如下所示: ```c int add(int sum) { if (sum == 0 || sum == 1) { // 明确递归终止条件 return sum; } return sum + add(sum - 1); // 使用合法的减法操作代替非法自减操作 } ``` ##### (2)无输出的原因 由于递归函数本身存在逻辑错误,导致程序进入死循环或栈溢出,从而无法执行后续代码并打印结果。此外,`main()` 函数中的变量声明后未初始化也可能会引起编译器警告甚至运行时错误[^5]。 --- #### 2. VSCode 配置 GDB 调试环境以诊断问题 为了更好地调试此类问题,可以通过配置 VSCode MinGW64 工具链来启用 GDB 调试支持。以下是详细的配置步骤: ##### (1)安装必要工具 确保已安装以下组件: - **MinGW-w64**: 提供 GCC 编译器 GDB 调试器。 - **VSCode 插件**: 安装 "C/C++" 扩展(由 Microsoft 提供)以及 "Code Runner" 或类似的插件用于快速测试代码。 ##### (2)创建 launch.json 文件 打开 `.vscode/launch.json` 文件,并按以下模板填写相关内容: ```json { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, // 启用外部控制台窗口便于查看输出 "MIMode": "gdb", "miDebuggerPath": "C:/path/to/mingw64/bin/gdb.exe", // 替换为实际路径 "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build" } ] } ``` ##### (3)构建任务配置 编辑 `.vscode/tasks.json` 文件以定义自动构建任务: ```json { "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "gcc", "args": [ "-g", // 添加调试信息 "${file}", // 输入源文件名 "-o", // 输出目标文件名 "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ] } ``` 完成上述配置后,按下 F5 即可在调试模式下启动程序,并利用断点、单步跟踪等功能精确定位问题所在。 --- #### 3. 总结与改进措施 通过修复递归函数逻辑错误以及正确配置 VSCode 的调试环境,可以显著提升开发效率并减少潜在问题的发生概率。需要注意的是,在编写递归函数时务必遵循以下原则: - 始终提供清晰且可靠的递归终止条件; - 确保每一次递归调用都能使问题规模缩小至最终收敛的状态; - 对于复杂的递归场景,优先采用迭代方法替代以降低性能开销堆栈风险[^6]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值