这个问题是关于最佳做法的。我正在实现一个3D间隔Kd-Tree,由于树的递归结构,我很想创建一个唯一的类KdTree
来表示树本身,节点和叶子。
然而:元素仅包含在叶子中,一些常规树参数(例如分割空间之前元素的最大数量)对于所有树来说都是相同的,最后分裂平面在叶子中根本没有意义
那说:我应该组成三个类(KdTree
,KdNode
,KdLeaf
)还是只假装每个节点或叶子实际上是一个Kd-Tree(其中,事实上,正是如此)和重复数据?
托马索
答案 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)。这种设计背后的想法是,您使用虚函数来区分分支和叶节点之间的行为,并且分支可以委托给它们的子节点。这是一个关于什么被称为访客模式的简单例子。