- 设计思路:
- 在Rust中,对于树结构中节点间的相互引用,需要使用
Rc
(引用计数)和Weak
(弱引用)类型来管理生命周期。Rc
用于增加引用计数,确保数据在还有其他部分引用它时不会被释放。而Weak
用于解决循环引用问题,它不会增加引用计数,避免出现循环引用导致内存泄漏。
- 每个节点可以包含一个
Rc
指向自身,同时对于指向其他节点的引用,可以使用Weak
。这样,当一个节点的Rc
计数变为0时,该节点及其所有直接或间接通过Rc
引用的节点都会被释放。Weak
引用可以在需要时提升为Rc
引用,但如果对应的Rc
计数已经为0,提升会失败。
- 关键代码片段:
use std::rc::{Rc, Weak};
// 定义树节点
struct TreeNode {
value: i32,
children: Vec<Rc<TreeNode>>,
parent: Weak<TreeNode>,
}
impl TreeNode {
fn new(value: i32) -> Rc<TreeNode> {
Rc::new(TreeNode {
value,
children: Vec::new(),
parent: Weak::new(),
})
}
fn add_child(&mut self, child: Rc<TreeNode>) {
self.children.push(child.clone());
child.parent = Rc::downgrade(&self);
}
}