面试题答案
一键面试数据结构定义
在Rust中,可以如下定义树形数据结构:
struct Node {
value: i32,
children: Vec<Box<Node>>,
}
这里使用Box<Node>
来持有子节点,Box
会在堆上分配内存,并且在Node
实例被销毁时自动释放其占用的内存,从而管理内存生命周期。Vec<Box<Node>>
用于存储多个子节点。
插入节点操作
插入节点时,需要创建新的Node
实例,并将其放入父节点的children
向量中。
impl Node {
fn insert_child(&mut self, new_value: i32) {
let new_child = Box::new(Node {
value: new_value,
children: Vec::new(),
});
self.children.push(new_child);
}
}
删除节点操作
删除节点时,需要找到要删除的节点并从其父节点的children
向量中移除。这涉及到遍历树来定位目标节点。
impl Node {
fn remove_child(&mut self, target_value: i32) {
self.children.retain(|child| child.value != target_value);
}
}
retain
方法会遍历children
向量,保留那些值不等于target_value
的子节点,从而达到删除目标节点的效果。
通过这种方式,利用Rust的所有权系统和智能指针(如Box
),可以有效地管理树形数据结构中节点引用的生命周期,避免内存安全问题。