我需要实现一个自定义树类(使用C ++)。在我的工作中,我见过许多树实现。一些实现了一个暴露给用户的“超级节点”类。其中一个(根节点)充当树的实例。一些人暴露了一个树类,它使用一个节点类来构造一个树。有些人使用节点类作为纯数据结构,将树构造等功能留给树类。其他人将类似node.Split()的构造放入节点类中。
假设您需要设计二叉树(如KD树)。从OOP的角度来看,什么是“最好的”方法。节点类只包含数据,还是将其自身分解为子节点的逻辑?一般来说节点类应包含多少逻辑?
感谢您提供建设性意见!
答案 0 :(得分:0)
这是你应该遵循的一条OOP规则,
每个班级代表一个实体。类具有属性和方法 即实体的属性及其行为
所以你需要按照你对场景的理解。
以下是我查看节点的方式。 它有一些数据,一个右节点参考和一个左节点参考。我不认为一个节点应该能够做任何事情,除了提供数据,所以我会写一个这样的节点类:
class Node
{
public:
int Data; // yeah, you would obviously use templates, so it's not restricted to a particular type
Node* Left;
Node* Right;
// also you can write constructors and maybe some sort of cast operator overload to be able to make the
// we could also make it return the subtree itself
getRightSubTree(){ return Tree(*Right); }
getLeftSubTree(){ return Tree(*Left); }
};
树应该是这样的。
class Tree
{
private:
Node root;
public:
Tree(Node t):root(t){} // every tree should have a root. Cannot be null.
// since the root node will be able to handle the tree structure, now we'll need the necessary methods
void addNode(Node n){
// code here
}
....
getSubTree(int data){
// check if node with that data exists and all
...
Node n = getNode(data);
return Tree(n);
}
};
好的,所以我觉得你现在有了一个主意。这都是关于你如何看待系统的。