我需要定义一个二叉搜索树,其中每个节点都可以访问父节点:
enum Tree<'a> {
Leaf,
Node {
left: Box<Tree<'a>>,
right: Box<Tree<'a>>,
parent: &'a Tree<'a>,
data: u64,
}
}
impl <'a> Tree<'a> {
pub fn new(data: u64, parent: &'a Tree) -> Tree<'a> {
Tree::Node {
left: Box::new(Tree::Leaf),
right: Box::new(Tree::Leaf),
parent,
data
}
}
pub fn insert_at_left_leaf(&'a mut self, data: u64) {
match *self {
Tree::Leaf => panic!("Leaf has no children"),
Tree::Node {ref mut left, ..} => {
**left = Tree::new(data, self);
}
}
}
}
fn main() {
let parent = Tree::Leaf;
let mut t = Tree::Node {
left: Box::new(Tree::Leaf),
right: Box::new(Tree::Leaf),
parent: &parent,
data: 1u64
};
t.insert_at_left_leaf(2);
}
但是,我收到以下编译错误:
error[E0502]: cannot borrow `*self` as immutable because `self.left` is also borrowed as mutable
--> src/main.rs:24:42
|
23 | Tree::Node {ref mut left, ..} => {
| ------------ mutable borrow occurs here
24 | **left = Tree::new(data, self);
| ^^^^ immutable borrow occurs here
25 | }
26 | }
| - mutable borrow ends here
在安全的Rust中执行此操作的范例方法是什么?具体来说,当我插入一个新节点作为现有节点的叶子时,我不想为它重新分配空间。已经为Leaf
分配了空间,我想简单地用新节点覆盖它。