2010-08-12 464 views
0

这个问题是关于最佳实践的。我正在实现3D间隔Kd-Tree,并且由于树的递归结构,我会试图创建一个独特的类,KdTree来表示树本身,节点和树叶。在树结构中,如何命名树,节点,树叶?

但是:元素只包含在树叶中,一些通用树参数(比如分割空间之前的元素的最大数量)对于所有的树来说意味着是相同的,并且最终分割平面根本没有意义树叶。

那说:我应该补三类(KdTreeKdNodeKdLeaf),或者只是假装每个节点或叶子实际上是一个KD树(其中,事实上,也正是如此)和重复数据?

托马索

回答

1

我会说没有必要为Tree类。最上面的元素像其他所有节点一样。

为了区分叶子和分支节点,我会去

namespace KdTree 
{ 
     abstract class Node 
     { 
      virtual EnumLeafNodes(LeafNodeCallback callback); 
      virtual GetLeafCount(); 

     } 

     class Leaf : Node 
     { 
      // implement virtuals by returning/counting leaf values 
     } 

     class Branch : Node 
     { 
      // implement virtuals by delegating to child nodes 

      // direct children: 
      Node[] children; 
     } 
} 

注意,这是非常伪代码(C#-ish)。这种设计背后的想法是,您使用虚拟功能来区分分支和叶节点之间的行为,并且分支可以委托给其子节点。这是访问者模式所知道的一个微不足道的例子。

1

创建和使用私人KdTree范围内的类KdNode和KdLeaf。这会让你的生活更轻松,并且隐藏程序其他部分的复杂性。

+0

使用这三个类可以更容易地理解数据结构的各个部分。 – Mark 2010-08-12 11:59:37

1

看起来前导和树是简单地位于“分支”末尾的节点。

在这些情况下,我只是将它们命名为“节点”,在解析它们时,我会将它们称为KdParentNode,KdNode和KdChildNode。如果节点没有父节点,则它是树(根)节点,如果它没有子节点,则它是叶节点。