news 2026/9/26 17:37:47

元宝 LeetCode 113.路径总和 || rust实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
元宝 LeetCode 113.路径总和 || rust实现

LeetCode 113(Path Sum II)是一道经典的 深度优先搜索(DFS)+ 回溯 题目。

解题思路

  1. 从根节点开始遍历,用一个
    “path” 动态记录从根到当前节点的路径。
  2. 用
    “current_sum” 记录当前路径上节点值的总和。
  3. 当遇到叶子节点时,检查路径总和是否等于
    “targetSum”。如果相等,将当前
    “path” 的拷贝加入结果集。
  4. 回溯:在递归返回前,将当前节点从
    “path” 中弹出,以便探索其他分支。

Rust 实现代码

在 LeetCode 中,
“TreeNode” 通常定义为
“Option<Rc<RefCell>>”。以下是可以直接提交的完整代码:

// 假设 LeetCode 已提供 TreeNode 的定义:
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell>>,
// pub right: Option<Rc<RefCell>>,
// }
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self { … }
// }

use std::rc::Rc;
use std::cell::RefCell;

impl Solution {
pub fn path_sum(root: Option<Rc<RefCell>>, target_sum: i32) -> Vec<Vec> {
let mut result: Vec<Vec> = Vec::new();
let mut path: Vec = Vec::new();

if let Some(node) = root { Solution::dfs(node, target_sum, 0, &mut path, &mut result); } result } // 深度优先搜索 fn dfs( node: Rc<RefCell<TreeNode>>, target_sum: i32, current_sum: i32, path: &mut Vec<i32>, result: &mut Vec<Vec<i32>> ) { // 取出当前节点的值,并加入路径 let val = node.borrow().val; path.push(val); let new_sum = current_sum + val; // 先克隆左右子节点的引用(避免持有 borrow 导致递归时 panic) let left = node.borrow().left.clone(); let right = node.borrow().right.clone(); // 判断是否为叶子节点 if left.is_none() && right.is_none() { if new_sum == target_sum { // 找到一条合法路径,克隆当前路径存入结果 result.push(path.clone()); } } else { // 递归遍历左右子树 if let Some(left_node) = left { Solution::dfs(left_node, target_sum, new_sum, path, result); } if let Some(right_node) = right { Solution::dfs(right_node, target_sum, new_sum, path, result); } } // 回溯:离开当前节点,将其从路径中移除 path.pop(); }

}

关键点解析(Rust 特性)

    “Rc<RefCell>” 的使用:

    • LeetCode 的树节点使用
      “Rc”(引用计数)允许多个所有者,
      “RefCell” 提供内部可变性。
    • 在递归前,通过
      “.clone()” 获取左右子节点的
      “Option<Rc<…>>”,这样不会长期持有
      “RefCell” 的借用,避免运行时 panic。
    1. 回溯与所有权:

    “path” 通过
    “&mut Vec” 传递,在递归前后分别执行
    “push” 和
    “pop”,手动维护路径状态。

    “result.push(path.clone())” 这里必须
    “clone”,因为
    “path” 后续还会被修改。
    3. 效率:

    • 时间复杂度:O(N),每个节点访问一次。
    • 空间复杂度:O(N)(递归栈深度及存储路径所需的空间)。

    如果你希望改成迭代法(使用显式栈)或者想了解如何处理 i32 溢出等边界情况,也可以告诉我!

    版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
    网站建设 2026/9/26 17:37:16

    PowerJob适配达梦数据库全流程:从建表改造到调度链路验证

    五月接了个国产化适配的项目&#xff0c;技术栈里其他组件都还好说&#xff0c;唯独调度中心这里卡了很久。PowerJob本身是个很能打的分布式调度框架&#xff0c;定时任务、工作流、MapReduce全都有&#xff0c;可它从设计之初就是奔着MySQL去的&#xff0c;底层一旦换成达梦DM…

    作者头像 李华
    网站建设 2026/9/26 17:37:16

    告别Kibana卡顿:用Elasticvue轻量GUI高效管理Elasticsearch集群

    如果你跟我一样&#xff0c;日常排查Elasticsearch问题时总得掂量一下机器内存——开一个Kibana恨不得吃掉2G堆内存&#xff0c;浏览器再开几个Tab&#xff0c;8G的服务器瞬间紧张起来&#xff1b;可让你全程用curl去敲REST请求吧&#xff0c;看个索引映射、翻几条文档又确实不…

    作者头像 李华
    网站建设 2026/9/26 17:36:58

    Oracle迁移KingbaseES实战:从对象盘点到SQL改造的完整指南

    这两年我接手了不少Oracle往KingbaseES迁移的项目&#xff0c;这套Oracle 19c生产系统换到KingbaseES V8R6&#xff0c;从盘点对象到应用切换&#xff0c;前后花了三周。很多团队容易踩同一个误区&#xff1a;把迁移当成“把数据导过去”&#xff0c;装个工具点一下执行就觉得完…

    作者头像 李华
    网站建设 2026/9/26 17:36:16

    IDC机房设计整体方案:供配电与制冷系统参数计算及避坑指南

    简介&#xff1a;IDC数据中心机房设计整体方案.ppt是一份面向IDC机房规划者、系统集成商及运维人员的完整设计参考&#xff0c;系统覆盖基础装修、供配电与UPS工程、空调通风、防雷接地、综合布线、安防与集中监控、KVM、消防等子系统&#xff0c;并给出了设计依据、等级标准建…

    作者头像 李华