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

Recursion 在树结构中,如何命名树、节点和叶子?,recursion,tree,naming-conventions,class,Recursion,Tree,Naming Conventions,Class,这个问题是关于最佳实践的。我正在实现一个3D interval Kd树,由于该树的递归结构,我会尝试创建一个独特的类,KdTree来表示树本身、节点和叶子 但是:元素仅包含在叶子上,一些常规树参数(例如拆分空间前的最大元素数)对于所有树都是相同的,最后拆分平面在叶子中没有任何意义 这就是说:我应该组成三个类(KdTree,KdNode,KdLeaf),还是假设每个节点或叶实际上是一个Kd树(事实上就是这样)并复制数据 Tommaso在KdTree的上下文中私有地创建和使用类KdNode和KdLe

这个问题是关于最佳实践的。我正在实现一个3D interval Kd树,由于该树的递归结构,我会尝试创建一个独特的类,
KdTree
来表示树本身、节点和叶子

但是:元素仅包含在叶子上,一些常规树参数(例如拆分空间前的最大元素数)对于所有树都是相同的,最后拆分平面在叶子中没有任何意义

这就是说:我应该组成三个类(
KdTree
KdNode
KdLeaf
),还是假设每个节点或叶实际上是一个Kd树(事实上就是这样)并复制数据


Tommaso

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

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

似乎前导和树是仅位于“分支”末尾的节点


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

似乎前导节点和树节点只是在“分支”末尾的开始处


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

我认为不需要
类。顶部元素与其他元素一样是一个节点

为了区分叶节点和分支节点,我选择

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

我想说,不需要
类。顶部元素与其他元素一样是一个节点

为了区分叶节点和分支节点,我选择

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

拥有这三个类可以更容易地理解数据结构的各个部分。拥有这三个类可以更容易地理解数据结构的各个部分。