在树结构中,如何命名树,节点,叶子?

时间:2010-08-12 11:48:39

标签: recursion tree naming-conventions class

这个问题是关于最佳做法的。我正在实现一个3D间隔Kd-Tree,由于树的递归结构,我很想创建一个唯一的类KdTree来表示树本身,节点和叶子。

然而:元素仅包含在叶子中,一些常规树参数(例如分割空间之前元素的最大数量)对于所有树来说都是相同的,最后分裂平面在叶子中根本没有意义

那说:我应该组成三个类(KdTreeKdNodeKdLeaf)还是只假装每个节点或叶子实际上是一个Kd-Tree(其中,事实上,正是如此)和重复数据?

托马索

3 个答案:

答案 0 :(得分:1)

在KdTree的上下文中私下创建和使用KdNode和KdLeaf类。这将使您的生活更轻松,并隐藏程序其他部分的复杂性

答案 1 :(得分:1)

似乎领导和树是简单地位于“分支”结尾的节点。

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

答案 2 :(得分:1)

我想说不需要Tree课程。 top元素就像其他所有节点一样。

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

 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)。这种设计背后的想法是,您使用虚函数来区分分支和叶节点之间的行为,并且分支可以委托给它们的子节点。这是一个关于什么被称为访客模式的简单例子。