Recursion 在递归数据类型(如树)中实现公共属性

Recursion 在递归数据类型(如树)中实现公共属性,recursion,data-structures,attributes,eiffel,Recursion,Data Structures,Attributes,Eiffel,在实现像TREE这样的递归数据结构时,我需要每个树都有一个公共属性,我想知道如何实现它: 将属性添加到树节点时,会为每个节点复制属性,而不是为每棵树复制一次 使用一次属性,我只为所有树获取一个共享属性,而不是每个树一个 有什么优雅的埃菲尔风格的解决方案吗?树有一个可分辨的根节点,可用于存储与整个树相关的信息,而不是与特定节点相关的信息。为了检索此信息,应该可以从树的任何其他节点到达根节点。一种可能的解决方案是使用一个功能parent,该功能将返回指定节点的父节点(或根节点的Current)。

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

  • 将属性添加到树节点时,会为每个节点复制属性,而不是为每棵树复制一次
  • 使用
    一次
    属性,我只为所有树获取一个共享属性,而不是每个树一个

有什么优雅的埃菲尔风格的解决方案吗?

树有一个可分辨的根节点,可用于存储与整个树相关的信息,而不是与特定节点相关的信息。为了检索此信息,应该可以从树的任何其他节点到达根节点。一种可能的解决方案是使用一个功能
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.root.my\u属性
从任意树节点
n
检索特定于树的属性值

编辑:


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

这取决于树结构。例如,是否可以从树的任何其他节点到达根节点?如果是,则根节点可以是具有必需属性的特殊节点,并且所有其他节点可以在需要时通过访问根节点来检索属性值。在一般树中,您无法到达根节点,但在一个实现中,您实际上可以。因此,当可以从任何节点(可能通过名为
parent
的属性)访问根节点时,您能否绘制一个部分答案。因此
n
是一个
,而
我的属性
的一部分?如果是这样,那么
my_属性是否存在于任何
节点中?如果是这样的话,那就不是一个答案(效率问题放在一边)。@U.Windl不同的实现是可能的。在一种情况下,树中的所有节点都具有相同的类型,每个节点中都存在该属性,但是,
n.root.my_属性
保证只使用一个版本。在另一个实现中,根具有专用类型。每个节点都将
my\u attribute
实现为一个返回
root.my\u attribute
的函数,但根节点除外,它是实际的属性。即使使用
一次
属性(这也解决不了问题)我担心
树的每个节点
都会包含一个
指针
,对应于
once
函数。具体来说,我想到的是一个类似于单个位(
BOOLEAN
)的东西。在C语言中(作为对比),可以使用位字段,最有可能的是在有一些备用位的地方(例如树平衡)。@U.Windl这个问题与语言无关,可以用任何语言提供一个有效的答案。实际上,我正在考虑一个基于数组的实现,这样做会更容易。