在SqueakSource(或您可能知道的任何其他人)使用BTree包并给出以下树
-Root
|
--Node1
|
--Node2
---Node21
---Node22
---Node23
----Node231
----Node232
-----Node2321
----Node233
|
--Node3
我试过写下面但没有成功:
这不是功课,我要求一个基本的例子是因为在BTree的情况下,文档几乎不存在,并且测试不足以找出基本用法,实际上示例与断言相混合并使用便利方法。
答案 0 :(得分:3)
B-Tree是将键与值相关联的排序数据结构。 B-Trees允许您处理大量数据并保证以对数时间进行搜索,插入和删除。 SqueakSource上的BTree Package遵循Smalltalk Dictionary
的协议:
at:
和at:ifAbsent:
用于搜索给定密钥的值at:put:
用于插入键和值对,removeKey:
用于删除密钥。此外,支持Dictionary
,do:
,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.