繁体   English   中英

树状结构中对父级的可变引用

[英]Mutable reference to parent in tree-like structure

我正在开发一个 Rust 程序,该程序对树结构执行操作,我们称它们为Node 不需要存储每个节点的子节点列表,但需要能够从任何其他节点返回到父节点。 假设结构不可变, struct Node可能如下所示:

struct Node<'a> {
    parent: Option<&'a Node<'a>>,
    // ... node attributes ...
}

问题是我需要改变树。 我有一个 function 接收叶节点并对树执行更改(仅更改节点属性,从不更改树结构)。 不仅要改变叶节点的属性,还要改变父节点的属性。

它可能看起来像这样:

fn mutate_tree(leaf: &mut Node) {
    leaf.attr1 = 42;
    leaf.parent.unwrap().attr1 = 43;
}

我如何设计struct Node以允许这些修改(并获得对父节点的可变引用)?

我总是从树的最深处向上遍历,而不是从相反的方向。

Node在函数中被实例化,这些函数也会销毁它们。 我正在尝试找到不需要对它们进行堆分配的解决方案,但如果这不容易实现,我可以忍受使用Rc分配所有节点。

由于多个孩子引用了同一个父母,因此您需要RefCell

struct Node<'a> {
    parent: Option<&'a RefCell<Node<'a>>>,
    // ... node attributes ...
}

fn mutate_tree(leaf: &mut Node) {
    leaf.attr1 = 42;
    leaf.parent.unwrap().borrow_mut().attr1 = 43;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM