我正在寻找关于如何组织分层树节点类的一些建议。
我有一个分层树,其中包含一些与树相关的成员,例如Parent
,Childs
,AddNode()
,RemoveNode()
等。每个节点都会使用特定于应用程序的数据同样。在阅读了大量文章后,我最终得到了两种可能的设计:
将树相关成员与单个树节点类中的节点值成员组合在一起:
public class TreeNodeClass {
// tree-specific members
public TreeNodeClass Parent { get; set; }
public IList<TreeNodeClass> Childs { get; set; }
public void AddNode() { }
public void RemoveNode() { }
public IEnumerable<TreeNodeClass> Traverse() { }
<...>
// value-specific members
public Type1 ValueSpecificProperty1 { get; set; }
<...>
public TypeN ValueSpecificPropertyN { get; set; }
public void Method1() { }
<...>
public void MethodN() { }
}
在单独的类中拆分树节点和节点值:
1)仅包含树相关成员的树节点类;
2)节点值类,它只包含特定于值的成员,并通过节点对象中的Value
成员引用此对象。
public class TreeNodeClass {
public TreeNodeClass Parent { get; set; }
public IList<TreeNodeClass> Childs { get; set; }
public TreeNodeValue Value { get; set; }
public void AddNode() { }
public void RemoveNode() { }
public IEnumerable<TreeNodeClass> Traverse() { }
<...>
}
public class TreeNodeValue {
public Type1 ValueSpecificProperty1 { get; set; }
<...>
public TypeN ValueSpecificPropertyN { get; set; }
public void Method1() { }
<...>
public void MethodN() { }
}
我的具体方案的一些细节:
int
,byte
,bool
和string
类型)和5-10种方法。< / LI>
Value
属性)对话。我敢打赌这两种情况都是有效的(因为它们在很多文章中被广泛使用),所以问题是:
答案 0 :(得分:4)
我会将这些担忧分开。树的关注点是维护修改后的树不变量。无论其关注点是什么,每个节点中数据的关注点都是如此。
我要做的是创建一个通用的容器类型Tree<T>
并使树知道 nothing 关于它的值,并且值知道关于树的 nothing 他们在。
现在,在某些情况下,树必须知道关于值的某些内容。例如,假设您正在构建一个权重平衡的二叉树,而不是您在这里构建的n-ary树。权重平衡的二叉树必须能够查询节点以找出&#34; heavy&#34;他们要产生可接受的平衡。有几种方法可以做到这一点。一种方法是要求T
实现一些IWeight
接口。另一种方法是要求树的创建者提供Func<T, double>
委托,该委托可以产生T
的权重。无论哪种方式,树只需要知道节点,以便完成其工作:维护树不变量。