在保留层次遍历的同时存储N元树的最节省空间的方法是什么?

时间:2011-08-30 15:04:27

标签: c# optimization data-structures tree

我看了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                          

我需要“从行层次结构中查找平面行索引”和“从行行索引中查找行层次结构”等操作。另外,为了支持展开/折叠,我需要“找到具有相同或更小深度的下一个节点”。

3 个答案:

答案 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树没有保持平衡,但往往相当密集,那么数组实现仍然比大多数空间效率更高......空节点是唯一的空间开销。但是,如果树的高度不平衡,那么阵列实现可能非常节省空间。