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