我看了this paper。
但是,如果有人已经做过,我想避免大量的研究来解决这个问题。我需要这个节省空间的树来进行合理(概念上)简单的GUI控制:TreeDataGridView with virtual mode
示例树可能如下所示:
(RowIndexHierarchy),ColumnIndex
(0),0
(0,0),0
(0,0,0),0
(0,0,0,0),0
(0,0,0,0,0),0
(0,0,0,1),0
(0,0,0,2),0
(0,0,1),0
(0,0,2),0
(0,0,2,0),0
(0,0,2,1),0
(0,0,2,2),0
(0,1),0
(0,2),0
(0,2,0),0
(0,2,0,0),0
(0,2,0,1),0
(0,2,0,2),0
(0,2,1),0
(0,2,2),0
(0,2,2,0),0
(0,2,2,1),0
(0,2,2,2),0
(1),0
我需要“从行层次结构中查找平面行索引”和“从行行索引中查找行层次结构”等操作。另外,为了支持展开/折叠,我需要“找到具有相同或更小深度的下一个节点”。
答案 0 :(得分:0)
对于只读树,您可以按其父索引存储已排序的节点数组。
0 a
1 (a/)b
1 (a/)c
2 (a/b/)d
2 (a/b/)e
2 (a/b/)f
3 (a/c/)c
每次您需要查找子节点时,您都可以使用二进制搜索来查找节点范围的上下边界。
答案 1 :(得分:0)
答案 2 :(得分:0)
存储平衡N-ary树的最节省空间的方法是在数组中......零空间开销!并且实际上非常有效地遍历...只需要一些简单的数学来计算你的索引中的父索引...或你索引中的N个孩子的索引。
要为此找到一些代码,请查找堆栈...堆结构(与内存堆无关)是一个平衡的二叉树...并且大多数人在数组中实现它。虽然它是二进制的,但对于N-ary也可以做同样的事情。
如果您的N-ary树没有保持平衡,但往往相当密集,那么数组实现仍然比大多数空间效率更高......空节点是唯一的空间开销。但是,如果树的高度不平衡,那么阵列实现可能非常节省空间。