下面是leetcode上面一个题目的Rust solution. #897 Increasing Order Search Tree
我想在注释的地方用Relink的方式复用当前的TreeNode,而不是创建一个新的TreeNode。也就是说,把当前这个root节点的left置为None,将其作为left_tail的right子节点,这样遍历就可以复用原来Tree所有的节点。
use std::cell::RefCell;
use std::rc::Rc;
impl Solution {
pub fn increasing_bst(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> {
let node = Some(Rc::new(RefCell::new(TreeNode::new(0))));
Self::do_increasing_bst(root, node.clone());
node.unwrap().borrow().right.clone()
}
pub fn do_increasing_bst(
root: Option<Rc<RefCell<TreeNode>>>,
tail: Option<Rc<RefCell<TreeNode>>>,
) -> Option<Rc<RefCell<TreeNode>>> {
if let Some(node) = root {
let mut left_tail = Self::do_increasing_bst(node.borrow().left.clone(), tail.clone());
// TODO: How to reuse the current node (i.e. root) without creating a new one?
let right_tail = Some(Rc::new(RefCell::new(TreeNode::new(node.borrow().val))));
left_tail.unwrap().borrow_mut().right = right_tail.clone();
Self::do_increasing_bst(node.borrow().right.clone(), right_tail.clone())
} else {
tail
}
}
}
尝试了很久,要么过不了编译器,要么会在运行时因为可变借用检查失败而挂掉。有没有人可以帮忙指点一下应该如何实现呢?
1
共 6 条评论, 1 页
评论区
写评论抱歉很久没登录论坛。完全没想到可以通过Option的get方法来解决这个问题,学到了,谢谢解答!
对以下内容的回复:
赞一个! 对以下内容的回复:
不过我搞明白了,之前的borrow冲突,其实是由于右子树遍历入口,对right 和 node 在参数级同时引用,使用一个临时变量可以解决这种冲突,如下:
呃,
貌似只能unsafe了,递归始终在borrow
对以下内容的回复:
和
Option
关系不大吧?提示:
Option
类型有个take
方法,可以把 option 中的内容取出来。