【发布时间】:2020-03-25 11:24:40
【问题描述】:
我有以下树形结构:
use std::cell::RefCell;
use std::rc::Rc;
use std::cmp;
use std::cmp::Ordering;
type AVLTree<T> = Option<Rc<RefCell<TreeNode<T>>>>;
#[derive(Debug, PartialEq, Clone)]
struct TreeSet<T: Ord> {
root: AVLTree<T>,
}
impl<T: Ord> TreeSet<T> {
fn new() -> Self {
Self {
root: None
}
}
fn insert(&mut self, value: T) -> bool {
let current_tree = &mut self.root;
while let Some(current_node) = current_tree {
let node_key = ¤t_node.borrow().key;
match node_key.cmp(&value) {
Ordering::Less => { let current_tree = &mut current_node.borrow_mut().right; },
Ordering::Equal => {
return false;
}
Ordering::Greater => { let current_tree = &mut current_node.borrow_mut().left; },
}
}
*current_tree = Some(Rc::new(RefCell::new(TreeNode {
key: value,
left: None,
right: None,
parent: None
})));
true
}
}
#[derive(Clone, Debug, PartialEq)]
struct TreeNode<T: Ord> {
pub key: T,
pub parent: AVLTree<T>,
left: AVLTree<T>,
right: AVLTree<T>,
}
fn main() {
let mut new_avl_tree: TreeSet<u32> = TreeSet::new();
new_avl_tree.insert(3);
new_avl_tree.insert(5);
println!("Tree: {:#?}", &new_avl_tree);
}
使用cargo build 构建很好,但是当我运行cargo run 时,出现以下错误:
线程“主”在“已经借用:BorrowMutError”时出现恐慌,src\libcore\result.rs:1165:5
注意:使用
RUST_BACKTRACE=1环境变量运行以显示回溯。错误:进程没有成功退出:
target\debug\avl-tree.exe(退出代码:101)
如果我只是打电话给insert(3),那就没问题了,我的树会被正确打印。但是,如果我在insert(3) 之后insert(5),我会得到那个错误。
我该如何解决这个问题?
【问题讨论】:
-
您的代码存在逻辑问题:
let current_tree = ...创建了一个新的局部变量。然而,只有在循环中重新分配current_tree时,该算法才能工作。如果将current_tree初始化为mut并在重新分配时删除let,则会出现编译错误。然而,这是最容易的部分。