在Smalltalk中构建和查询示例常规树

时间:2011-08-19 07:52:21

标签: tree smalltalk

在SqueakSource(或您可能知道的任何其他人)使用BTree包并给出以下树

-Root
|
--Node1
|
--Node2
---Node21
---Node22
---Node23
----Node231
----Node232
-----Node2321
----Node233
|
--Node3

我试过写下面但没有成功:

  • 构建树
  • 鉴于Node23回答其直接孩子
  • 鉴于Node2回答了所有孩子
  • 给定任何节点,回答其父节目
  • 收集所有孩子

这不是功课,我要求一个基本的例子是因为在BTree的情况下,文档几乎不存在,并且测试不足以找出基本用法,实际上示例与断言相混合并使用便利方法。

2 个答案:

答案 0 :(得分:3)

B-Tree是将键与值相关联的排序数据结构。 B-Trees允许您处理大量数据并保证以对数时间进行搜索,插入和删除。 SqueakSource上的BTree Package遵循Smalltalk Dictionary的协议:

  • at:at:ifAbsent:用于搜索给定密钥的值
  • at:put:用于插入键和值对,
  • removeKey:用于删除密钥。

此外,支持Dictionarydo:keysDo:valuesDo:,...)的keysAndValuesDo:知道的所有迭代器函数;还有一些迭代密钥范围(from:do:from:to:do:upTo:do:,...)。通常,除非内置Dictionary类存在性能问题,否则不应在应用程序代码中使用B-Tree集合。

在我看来,你试图修改B树的内部工作原理。你不应该这样做,BTree类自动重组自己以始终提供最有效的表示(这主要是测试验证的)。如果您想管理自己的树,为什么不创建自己的Node类,其中包含OrderedCollection子节点和父链接?

答案 1 :(得分:3)

如果您不太关心执行速度,那么SqueakSource中有一个广泛记录的包,用于此目的http://www.squeaksource.com/TreeLW.html最初是为VisualWorks发布的。

可用于构建树的一个类是SKPVTreeLW,它支持值,子树,超树和键。您可以通过以下方式实现您的示例:

t := SKPVTreeLW
    key: '1'
    value: 'N' 
    subTrees: { 
        ( SKPVTreeLW key: '2' value: 'A' ) .
        ( SKPVTreeLW key: '3' value: 'B' subTrees: { 
            ( SKPVTreeLW key: '31' value: 'C' subTrees: { ( SKPVTreeLW key: '311' name value: 'D' ) } ) .
            ( SKPVTreeLW key: '32' value: 'E' subTrees: Array empty ) } ) .
        ( SKPVTreeLW key: '4' value: 'F' ) .
        ( SKPVTreeLW key: '5' value: 'G' ) .
        ( SKPVTreeLW key: '6' value: 'H' ) }.
" Subtrees of node 'B' "
t recursiveDetect: [ : s | s value = 'B' ] 
        inclusive: true 
        topDown: true 
        breadthFirst: true.
" or searching by key "
t atKey: '3'
" Childrens as nodes "
t recursiveSubTrees: true.
" Direct children "
t values.