我的问题是:描述节点之间的关系以在树上强制执行结构所需的最少信息量是多少?如何简洁地表达这些规则?
我有一个树数据结构(在C ++中,如果它对任何人都很重要。一个std :: vector的std :: vectors,指针备份给父母。)。节点可以是专门的。当节点是专用的时,它可能只是有效的"因为它有某些父母,或者只有在有某些孩子时才有效。系统不具备所有各种节点类型的100%知识(即,用户构建具有新节点的插件并且那些节点可以具有新规则)。虽然一切运作良好,但它依赖于我们对如何构建树的先验知识。 (一个新用户可以在某个逻辑上没有意义的地方放置节点,这是我们想要检测和阻止的。)
我们希望能够强制执行"一个有效的结构。允许一些节点连接到任何地方,而其他节点有特殊的地方等。当然,所有节点都从一个公共基类继承,并有一个包含所有子节点的列表和指向其父节点的指针。很简单。
我的第一次尝试是简单地允许节点列出其有效的父类型。然而,这导致一些节点非常混杂,并将自己附加到父母身上,而这些节点根本没有意义。为了解决这个问题,我添加了一个节点可以接受的子类型列表。这很好地将树与树配对,但是使管理变得更加困难,并且考虑到一些节点具有的多级继承,难以掩盖某些类型的子节点而允许其他节点。
此时,我认为值得一提这个问题。树木不是我的专长......当然,有人知道一种定义明确的方法来构建这样一棵树,并以灵活而有意义的方式强化关系。想法或想法?
其他信息,如果重要:结构往往非常宽(数百到数千个节点)和浅(2-10级深)。往往有一个根与一到五个子树......这是真正的工作开始的地方。我很高兴使用STL,Boost或任何其他可能对此有帮助的库。我不想重新发明这棵树。能够表示节点之间的关系以构造树是问题的焦点。
答案 0 :(得分:0)
我对您的问题的理解是您希望在节点之间建立一个或多个关系。
最简单的方法是为每种种类的关系设置一个链接。如果要在关系中的两个方向(向前和向后)进行遍历,则每个关系需要有两个链接。
如果您想拥有动态关系,我建议每个节点都有map
,std::map<relation, link>
。第一项(密钥)将是枚举关系标识符(或std::string
)。该值将是指向节点的链接。这可以让你说出这样的话:
next_node = node_links[NEXT_BY_ALPHABETICAL];
我建议您绘制对象之间的关系。还绘制树和节点之间的关系。
另一种选择是拥有单独的树,每个树关系一个。这些树中的每个节点都包含一个指向数据项的指针。因此只存在一个数据项;但是可能存在一个或多个索引(关系)指针。
最后,您可能需要考虑使用数据库,可能是关系数据库。