我想知道树中的子节点应该知道其父节点的信息量的最佳实践。
我目前的问题相当简单直接。我有一个信息树,并希望得到一个叶子节点的“全名”(在这种情况下,它将是树中每个节点的名称,叶子节点用点分隔)。我可以通过向叶子节点添加“getFullName”方法来实现这一点,这些叶子节点遍历树到根并且预先添加每个父节点的名称并返回最终结果但是这将要求叶节点知道其父节点的类类型(叶子)和非叶子不是同一类)。或者我可以在其他地方添加一个基本相同的实用程序函数,但知道不同的类类型。
我试图搜索一下,但问题有点过于宽泛,无法在Google上获得任何有用的点击。
提前致谢。
答案 0 :(得分:3)
你做在这里有很多选择,是的,你的问题一方面解决了处理效率受损的常见情况,另一方面存储需求增加,另一方面可能存在冗余。
没有单一的最佳做法。空间/时间权衡取决于您的情况。如果您使用冗余存储,同时保留节点内的子链接和父链接,则需要确保数据结构已正确封装,并且您的方法保持一致。
由于您的用例从顶部开始遍历节点,因此父链接可以正常工作,您可以通过递归或从后到前构建字符串来组成全名。因为用例适合您的情况,所以这不是一个坏主意。
另一种选择是在节点中存储全名,但如果您移动节点,则会增加冗余。
简而言之,您不必担心违反最佳做法,但您应该权衡所有选择,以便做出适合您的选择。
现在,如果您正在创建一个通用的树数据结构,例如Java的TreeNode,您可能会创建一个接口并允许人们按照自己的意愿实现内容,从而提供具有所有链接的合适的通用实现(DefaultMutableTreeNode) - 父母,孩子和兄弟姐妹。
答案 1 :(得分:1)
您描述的案例是使用递归的典型案例。换句话说,树中的每个节点都可以使用以这种方式定义的getFullName
方法:
string getFullName() {
myFullName = myParent.getFullName() + myLocalName;
return myFullName;
}
(这是伪代码;我假设如果myParent
为nil,那么myParent.getFullName()
是空字符串,您可以根据您的特定语言更改内容)
当没有父级时,递归结束。节点必须知道的唯一事情是它自己的名字以及它的父亲是谁。
答案 2 :(得分:1)
我认为让子节点类“知道”其父节点没有任何问题。如果您担心可扩展性,父母可以实现接口。
另一个替代方法是让父类更新其子树中所有子节点的“名称”字段...如果您创建一个大树然后只是查询它(恒定时间查找)可能有意义。同样,如果您担心过多的耦合,接口可以提供帮助。
答案 3 :(得分:1)
至少每个节点都应该知道它的父节点。 Leaf和非Leaf节点具有不同的类,但这意味着每个父节点都属于同一个类。使用它来遍历树并在你去的时候建立名称(反过来)。