我正在尝试在 Rust 中实现红黑树。在与编译器斗争了 2 天后,我准备放弃并在这里寻求帮助。
这个问题对我有很大帮助:如何在 Rust 中处理/规避“无法分配给...在 & 引用后面”?
我查看了 Rust 中 RB-Trees 的现有示例代码,但我看到的所有示例代码都使用了某种形式的不安全操作或null
,我们不应该在这里使用。
我有以下代码:
#[derive(Debug, Clone, PartialEq)]
pub enum Colour {
Red,
Black,
}
type T_Node<T> = Option<Box<Node<T>>>;
#[derive(Debug, Clone, PartialEq)]
pub struct Node<T: Copy + Clone + Ord> {
value: T,
colour: Colour,
parent: T_Node<T>,
left: T_Node<T>,
right: T_Node<T>,
}
impl<T: Copy + Clone + Ord> Node<T>
{
pub fn new(value: T) -> Node<T>
{
Node {
value: value,
colour: Colour::Red, // add a new node as red, then fix violations
parent: None,
left: None,
right: None,
// height: 1,
}
}
pub fn insert(&mut self, value: T)
{
if self.value == value
{
return;
}
let mut leaf = if value < self.value { &mut self.left } else { &mut self.right };
match leaf
{
None =>
{
let mut new_node = Node::new(value);
new_node.parent = Some(Box::new(self));
new_node.colour = Colour::Red;
(*leaf) = Some(Box::new(new_node));
},
Some(ref mut leaf) =>
{
leaf.insert(value);
}
};
}
}
该行new_node.parent = Some(Box::new(self));
给了我错误。我理解为什么会发生错误(self
被声明为可变引用)并且我不知道如何解决这个问题,但我需要self
成为一个可变引用以便我可以修改我的树(除非你可以提出更好的建议)。
我试图将 声明T_Node
为具有可变引用而不是 just Node
,但这只会产生更多问题。
我也乐于接受有关更好地选择变量类型的建议以及其他建议。
任何帮助表示赞赏。