在递归数据类型如 TREE中实现公共属性

问题描述

在实现像 TREE 这样的递归数据结构时,我需要每个 TREE 一个公共属性,我想知道如何实现它:

有没有优雅的 eiffel 风格的解决方案?

解决方法

一棵树有一个独特的节点,可用于存储与整棵树相关的信息,而不是与特定节点相关的信息。为了检索此信息,应该有可能从树的任何其他节点到达根节点。一种可能的解决方案是拥有一个特征 parent,它将返回指定节点的父节点(或 Current 为根)。那么,获取根节点的特征就可以是这样的

root: TREE
        -- The root of the tree.
    local
        p: TREE
    do
        from
            Result := Current
            p := parent
        until
            Result = p -- `Result = Result.parent` when `Result` is root.
        loop
            Result := p
            p := p. parent
        end
    ensure
        Result.parent = Result -- `Result` has no other parent.
    end

然后可以从带有 n 的任意树节点 n.root.my_attribute 中检索特定于树的属性值。

编辑:

另一种可能性是拥有一个带有所需数据的专用 CELL,树中的所有节点都只是引用这个单元格。好处是不需要对父节点的引用,并且可以立即访问数据。