Pointers 使用父指针创建锈树的范例方法是什么?

Pointers 使用父指针创建锈树的范例方法是什么?,pointers,rust,binary-search-tree,Pointers,Rust,Binary Search Tree,我需要定义一个二进制搜索树,其中每个节点都可以访问父节点: enum Tree<'a> { Leaf, Node { left: Box<Tree<'a>>, right: Box<Tree<'a>>, parent: &'a Tree<'a>, data: u64, } } impl <'a> Tree<'a

我需要定义一个二进制搜索树,其中每个节点都可以访问父节点:

enum Tree<'a> {
    Leaf,
    Node {
        left: Box<Tree<'a>>,
        right: Box<Tree<'a>>,
        parent: &'a Tree<'a>,
        data: u64,
    }
}

impl <'a> Tree<'a> {
    pub fn new(data: u64, parent: &'a Tree) -> Tree<'a> {
        Tree::Node {
            left: Box::new(Tree::Leaf),
            right: Box::new(Tree::Leaf),
            parent,
            data
        }
    }
    pub fn insert_at_left_leaf(&'a mut self, data: u64) {
        match *self {
            Tree::Leaf => panic!("Leaf has no children"),
            Tree::Node {ref mut left, ..} => {
                **left = Tree::new(data, self);
            }
        }
    }
}

fn main() {
    let parent = Tree::Leaf;
    let mut t = Tree::Node {
        left: Box::new(Tree::Leaf),
        right: Box::new(Tree::Leaf),
        parent: &parent,
        data: 1u64
    };
    t.insert_at_left_leaf(2);
}

在安全防锈中,这样做的范例是什么?具体来说,当我插入一个新节点作为现有节点的叶子时,我不想为它重新分配空间。已经为
叶分配了空间,我只想用新节点覆盖它。

这不是树。如果它有一个父指针,它就是一个图形,而不是一棵树。我不同意。拥有父指针是一个实现细节。最终,使数据结构成为树或图形的是它所公开的API(即,从用户的角度来看,它们的周期是否在数据结构中?)。@Shepmaster我查看了另一个副本,该副本说,在安全环境中是不可能的。顺便说一下,Rust文档将带有父指针的树称为树,而不是图形:我没有说它不安全。您完全可以让一个值包含对其自身的引用,只要您从不修改或移动它,这不是大多数人想要的。有关详细信息,请参阅-您的家长将存储一个对家长的引用的子代,因此您将存储对自己的引用。“无论添加多少关键字,您都无法编写实际上不安全的代码。”-这不是事实。在不安全的块中,您可以编写代码来解除对绝对不安全的未分配内存的引用。例如:不安全的{let p=1;let q=p as*const i64;println!(“{:?},*q);}