我是一个新手,我想写一个二叉树。定义的结构体如下
use std::{cell::RefCell, rc::Rc};
type Tree<K> = Option<Rc<RefCell<Node<K>>>>;
#[derive(Debug)]
struct Node<K: Copy+PartialOrd>{
l: Tree<K>,
r: Tree<K>,
v: K,
}
因为要有一个指针指向各个节点来对比,还要有一个头节点。出现了两个指针指向同一个,所以要Rc
。又Rc
内部不可以变,我却需要改变数值,所以在Rc中包裹RefCell
.
问题出现在我写插入函数上,根节点是root
,我定义一个指针ptr
指向根节点,随着对比数值大小,开始走向左子树,右子树,本来应该ptr
指向下一个节点,但是ptr却出现了无法赋值的现象,请大佬们帮帮忙🥺
impl <K: Copy+PartialOrd+Eq>Node<K> {
pub fn new(val: K) -> Self{
Node{
l: None,
r: None,
v: val,
}
}
fn insert(root: Tree<K>,val: K) -> Tree<K>{
if let Some(mut _root) = root{
let mut ptr = _root.clone();
loop{
if ptr.borrow().v < val {
// 右子树
if let Some(right) = &ptr.borrow().r{
ptr = right.clone(); // 报错 cannot assign to `ptr` because it is borrowed
}else{
ptr.borrow_mut().r = Some(Rc::new(RefCell::new(Node::new(val))));
return Some(_root);
}
}else {
// 左子树
// to do
}
}
}else {
return Some(Rc::new(RefCell::new(Node::new(val))));
}
}
}
1
共 8 条评论, 1 页
评论区
写评论用一个临时的变量可以解决这个问题,希望下面的代码可以给你提供参考:
经过简化可以变成下面的代码:
确实是现成的二叉树库在rust里面的,我最近是在看一些基础的东西想用rust实现,顺便熟悉一下rust。总之谢谢师傅提供的这个信息
--
👇
chenge: 这里有一个算法库,好像写法看上去要好很多。
https://github.com/TheAlgorithms/Rust
box是把数据放堆上,不允许有两个指针指向他,用Rc就可以有两个指针执行同一个内存地址了。但是Rc要求同时包装后的数据内部是不可以变动的,为了防止内存泄漏,这就要再Rc里面包装一个RefCell。RefCell可以使得Rc内部可变
--
👇
munpf: 我记得树这种只有一个父节点的数据结构,用Box就可以了吧,这里面有说明:https://rustcc.cn/article?id=2402b3fe-0180-4126-a8e3-90cfd837c476,用Rc和RefCell有其他好处吗?
我记得树这种只有一个父节点的数据结构,用Box就可以了吧,这里面有说明:https://rustcc.cn/article?id=2402b3fe-0180-4126-a8e3-90cfd837c476,用Rc和RefCell有其他好处吗?
这里有一个算法库,好像写法看上去要好很多。
https://github.com/TheAlgorithms/Rust
这个写法也太难看了吧,严重打击学习的信心。
谢谢师傅,牛啊牛啊
--
👇
ywxt: ``` // 右子树 let right = ptr.borrow().r.clone(); if let Some(right) = right { ptr = right; } else { ptr.borrow_mut().r = Some(Rc::new(RefCell::new(Node::new(val)))); return Some(_root); }