news 2026/9/29 15:04:27

元宝 LeetCode 129. 求根节点到叶节点数字之和 Rust实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
元宝 LeetCode 129. 求根节点到叶节点数字之和 Rust实现

这是 LeetCode 129 题 “求根节点到叶节点数字之和” 的 Rust 实现。

题目描述

给你一个二叉树的根节点
“root”,树中每个节点都存放有一个
“0” 到
“9” 之间的数字。

每条从根节点到叶节点的路径都代表一个数字(例如路径
“1 -> 2 -> 3” 表示数字
“123”)。

计算从根节点到叶节点生成的所有数字之和。

解题思路:深度优先搜索(DFS)

利用递归进行深度优先遍历:

  1. 传递累加值:在递归过程中,将“从根节点到当前节点父节点所组成的数字”作为参数
    “current_sum” 向下传递。
  2. 计算当前节点值:到达当前节点时,更新路径数字为
    “current_sum * 10 + node.val”。
  3. 判断叶子节点:如果当前节点是叶子节点(左右子节点均为空),则直接返回该路径组成的数字。
  4. 递归左右子树:如果不是叶子节点,则继续递归计算左子树和右子树的结果,并将它们相加返回。

说明:Rust 中 LeetCode 的二叉树通常定义为
“Option<Rc<RefCell>>”,我们通过
“borrow()” 来读取节点数据,通过
“clone()” 来传递子节点的智能指针。

LeetCode 风格核心代码

use std::rc::Rc;
use std::cell::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 {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }

impl Solution {
pub fn sum_numbers(root: Option<Rc<RefCell>>) -> i32 {
Self::dfs(root, 0)
}

fn dfs(root: Option<Rc<RefCell<TreeNode>>>, current_sum: i32) -> i32 { match root { None => 0, Some(node) => { // 借用节点,读取数据 let node_ref = node.borrow(); let new_sum = current_sum * 10 + node_ref.val; // 如果是叶子节点,直接返回当前路径组成的数字 if node_ref.left.is_none() && node_ref.right.is_none() { return new_sum; } // 否则递归计算左右子树,并相加结果 // 注意:这里使用 clone() 增加引用计数,而不是转移所有权 Self::dfs(node_ref.left.clone(), new_sum) + Self::dfs(node_ref.right.clone(), new_sum) } } }

}

完整可运行示例(含本地测试)

如果你想在本地运行测试,可以使用以下完整代码:

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

// 二叉树节点定义
#[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 {
TreeNode { val, left: None, right: None }
}
}

struct Solution;

impl Solution {
pub fn sum_numbers(root: Option<Rc<RefCell>>) -> i32 {
Self::dfs(root, 0)
}

fn dfs(root: Option<Rc<RefCell<TreeNode>>>, current_sum: i32) -> i32 { match root { None => 0, Some(node) => { let node_ref = node.borrow(); let new_sum = current_sum * 10 + node_ref.val; if node_ref.left.is_none() && node_ref.right.is_none() { return new_sum; } Self::dfs(node_ref.left.clone(), new_sum) + Self::dfs(node_ref.right.clone(), new_sum) } } }

}

fn main() {
// 示例 1: [1,2,3]
// 1
// /
// 2 3
let root = Rc::new(RefCell::new(TreeNode::new(1)));
let left = Rc::new(RefCell::new(TreeNode::new(2)));
let right = Rc::new(RefCell::new(TreeNode::new(3)));
root.borrow_mut().left = Some(left);
root.borrow_mut().right = Some(right);
println!(“示例1结果: {}”, Solution::sum_numbers(Some(root))); // 输出: 25

// 示例 2: [4,9,0,5,1] // 4 // / \ // 9 0 // / \ // 5 1 let root2 = Rc::new(RefCell::new(TreeNode::new(4))); let left2 = Rc::new(RefCell::new(TreeNode::new(9))); let right2 = Rc::new(RefCell::new(TreeNode::new(0))); let left2_left = Rc::new(RefCell::new(TreeNode::new(5))); let left2_right = Rc::new(RefCell::new(TreeNode::new(1))); left2.borrow_mut().left = Some(left2_left); left2.borrow_mut().right = Some(left2_right); root2.borrow_mut().left = Some(left2); root2.borrow_mut().right = Some(right2); println!("示例2结果: {}", Solution::sum_numbers(Some(root2))); // 输出: 1026

}

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树的节点数,每个节点恰好被访问一次。
  • 空间复杂度:O(h),其中 h 是二叉树的高度。主要为递归调用栈所占用的空间,最坏情况下(链状树)为 O(n)。

💡 延展思考

除了递归 DFS,你还可以使用 迭代法(BFS/DFS 借助栈或队列) 来解决,避免递归栈溢出的风险。

需要我为你提供迭代法(使用栈)的 Rust 实现,或者帮你详细解析
“Rc” 在二叉树中的内存管理逻辑吗?

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

搜推一体架构设计:搜索与推荐怎么融合?四层架构与四阶段落地

摘要&#xff1a;搜推一体架构的关键不是合并两个系统&#xff0c;而是把数据层、召回层共用到底座上&#xff0c;只在排序与策略层分场景分离&#xff1b;落地顺序为统一事件流 → 共用向量召回 → 分场景排序 → 策略联动。 搜索与推荐各建一套索引、各记一份日志&#xff0c…

作者头像 李华
网站建设 2026/9/29 15:03:57

前端异常监控体系搭建:捕获、格式化到上报的完整方案

前两天线上出了个问题&#xff1a;用户点某个按钮页面直接白屏&#xff0c;群里反馈了好几条消息&#xff0c;我在本地试了半天也没复现。最后查日志才发现&#xff0c;错误在 low-end 机型上偶发&#xff0c;而代码里唯一留下的线索就是一行 console.log(error) 。问题是&am…

作者头像 李华
网站建设 2026/9/29 15:03:01

AI;DR与Don‘t be a meat proxy:构建自动化技术摘要流水线

如果你每天的工作里有一项固定的动作&#xff1a;打开一篇技术文章&#xff0c;复制正文&#xff0c;贴到 AI 对话框里&#xff0c;让它总结&#xff0c;再把答案复制回文档或者群里。那么你有没有想过&#xff0c;这个“复制 — 粘贴 — 再复制”的循环里&#xff0c;真正不可…

作者头像 李华
网站建设 2026/9/29 14:59:17

C语言介绍(一)

一、C语言的概念 1.C语言是什么&#xff1f; 答&#xff1a;C语言是一种计算机语言&#xff0c;其他的计算机语言还有C/Java/GO/Python等。 2.C语言的历史 答&#xff1a;C语言最初是作为Unix系统开发工具而发明的。 3.编译器的选择-VS2022 3.1编译和链接 C语言是一门编译…

作者头像 李华
网站建设 2026/9/29 14:52:16

回形针最大化器:AI目标错位与防失控清单

如果你跟我一样长期在生产环境里调模型、改策略、定KPI&#xff0c;大概早就发现一个魔咒&#xff1a;凡是挂在后台的指标&#xff0c;最后都会被系统以各种方式"顶着涨"。我每次被这种问题折磨的时候&#xff0c;脑子里都会蹦出一个词&#xff1a;paperclip。准确地…

作者头像 李华