面试题答案
一键面试设计思路
- 定义树节点结构体:创建一个自定义结构体来表示树节点,包含节点数据以及指向子节点的指针。
- 并行遍历逻辑:使用
std::thread::spawn
来创建新线程进行子树的遍历。由于Rust所有权系统,需要考虑如何安全地将子树所有权转移到新线程中。 - 嵌套函数:在主遍历函数内部定义处理节点数据和遍历子树的嵌套函数,这样可以方便地访问主函数的局部变量和环境。
关键代码实现
use std::thread;
// 定义树节点结构体
struct TreeNode {
data: i32,
children: Vec<TreeNode>,
}
impl TreeNode {
fn parallel_traverse(&self) -> i32 {
// 定义嵌套函数处理单个节点
fn process_node(node: &TreeNode) -> i32 {
node.data * node.data
}
// 定义嵌套函数并行遍历子树
fn traverse_children(children: &[TreeNode]) -> i32 {
let mut handles = vec![];
for child in children {
let handle = thread::spawn(move || child.parallel_traverse());
handles.push(handle);
}
let mut total = 0;
for handle in handles {
total += handle.join().unwrap();
}
total
}
let node_result = process_node(self);
let children_result = traverse_children(&self.children);
node_result + children_result
}
}
你可以这样测试代码:
fn main() {
let tree = TreeNode {
data: 2,
children: vec![
TreeNode {
data: 3,
children: vec![TreeNode { data: 4, children: vec![] }],
},
TreeNode { data: 5, children: vec![] },
],
};
let result = tree.parallel_traverse();
println!("Total result: {}", result);
}