尝试使用以下结构在锈中创建树:
pub struct Node{
pub children: Vec<Box<Node>>,
pub parent: Option<Box<Node>>,
pub value: f32,
//.....
}
要构建新节点,请使用以下功能:
pub fn build_node(parent: Option<Box<Node>>)-> Node{
Node{
children: vec![],
parent,
value: 0.0,
}
}
[尝试添加节点时,例如:
let mut root_nd = tree::build_node(None, 5, state);
let mut next_nd = tree::build_node(Some(Box::new(root_nd)), 2);
root_nd.children.push(Box::new(next_nd));
会有错误,因为例如我要借用root_nd
,然后尝试将next_nd
添加到root.children
列表中,即使没有此错误,我仍然需要next_nd
的参考将其添加到root_nd
的子级之后。我知道在rust中,同一元素不可能同时具有多个可变引用。因此问题是,如何在rust中建立具有双向引用的树状数据结构?在我看来,这是一个冲突,因为rust不需要多个引用,但是我需要树的中间的一个节点同时被其父节点和其子节点都引用。
最近我一直在Rust中干预树木。要使用生锈的树木,您需要Rc
(A single-threaded reference-counting pointer),以便可以拥有多个所有权。而且您还需要Rc
来启用内部可变性,因为编译器不允许多个可变引用。使用RefCell
和Rc
,可以如下定义TreeNode