在计算机科学中,LCA(Lowest Common Ancestor,最近公共祖先) 是树结构中的一个经典问题。无论是在面试题、竞赛题,还是实际工程应用中,LCA 算法都扮演着重要角色。本文将带你从零开始,用 Rust 语言 实现 LCA 算法,并确保即使你是编程新手也能轻松理解。
假设你有一棵有根树(通常以节点 0 或 1 为根),给定两个节点 u 和 v,它们的 最近公共祖先 就是离这两个节点最近的共同祖先节点。

例如,在上图中,节点 4 和节点 5 的 LCA 是节点 2;而节点 4 和节点 6 的 LCA 是节点 1。
Rust 是一门内存安全、高性能的系统级编程语言。它没有垃圾回收机制,却能通过所有权系统保证内存安全。使用 Rust 实现 Rust LCA算法 不仅能提升程序效率,还能帮助你深入理解树结构与递归/迭代算法的结合。
我们采用一种简单但高效的策略:路径存储法。具体步骤如下:
u 和 v 的路径。这种方法的时间复杂度为 O(n),空间复杂度也为 O(n),适合初学者理解和实现。后续还可以优化为倍增法(Binary Lifting)或 Tarjan 离线算法,但本文聚焦于基础实现。
首先,我们需要构建一棵树。我们可以用邻接表表示树结构。然后编写一个函数来获取从根到目标节点的路径。
use std::collections::HashMap;// 构建父节点映射(用于快速回溯路径)fn build_parent_map(tree: &HashMap<i32, Vec<i32>>, root: i32) -> HashMap<i32, i32> { let mut parent = HashMap::new(); let mut stack = vec![root]; parent.insert(root, -1); // 根节点的父节点设为 -1 while let Some(node) = stack.pop() { if let Some(children) = tree.get(&node) { for &child in children { if !parent.contains_key(&child) { parent.insert(child, node); stack.push(child); } } } } parent}// 获取从根到 target 的路径fn get_path_to( target: i32, parent: &HashMap<i32, i32>) -> Vec<i32> { let mut path = Vec::new(); let mut current = target; while current != -1 { path.push(current); current = *parent.get(¤t).unwrap_or(&-1); } path.reverse(); path}// 计算 LCAfn lca( u: i32, v: i32, tree: &HashMap<i32, Vec<i32>>, root: i32) -> Option<i32> { let parent = build_parent_map(tree, root); let path_u = get_path_to(u, &parent); let path_v = get_path_to(v, &parent); let mut lca_node = None; let min_len = std::cmp::min(path_u.len(), path_v.len()); for i in 0..min_len { if path_u[i] == path_v[i] { lca_node = Some(path_u[i]); } else { break; } } lca_node}// 示例使用fn main() { let mut tree = HashMap::new(); tree.insert(1, vec![2, 3]); tree.insert(2, vec![4, 5]); tree.insert(3, vec![6]); // 节点 4,5,6 为叶子,无需插入 let root = 1; let u = 4; let v = 5; match lca(u, v, &tree, root) { Some(ans) => println!("LCA of {} and {} is {}", u, v, ans), None => println!("One or both nodes not found in tree"), }}build_parent_map:通过 DFS 遍历整棵树,记录每个节点的父节点。get_path_to:利用父节点映射,从目标节点一路回溯到根,再反转得到正向路径。lca:比较两条路径,找出最后一个相同的节点。这个实现清晰展示了 树结构算法 Rust 的基本范式:使用 HashMap 存储关系,用栈模拟递归,避免栈溢出。
上述方法适用于单次查询。如果需要多次查询(如 10⁵ 次),建议使用 倍增法(Binary Lifting) 预处理,将每次查询时间降至 O(log n)。这属于进阶内容,可在掌握基础后继续学习。
通过本文,你已经学会了如何用 Rust 实现 LCA 算法。这不仅是一次 Rust编程教程 的实践,更是对树结构和路径查找算法的深入理解。希望你能在此基础上继续探索更高效的算法,如 Tarjan 或 Euler Tour + RMQ 方法。
关键词回顾:Rust LCA算法、最近公共祖先 Rust、树结构算法 Rust、Rust编程教程。
本文由主机测评网于2025-12-08发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124818.html