C#树节点类设计

时间:2015-11-15 12:10:41

标签: c# tree

我正在寻找关于如何组织分层树节点类的一些建议。

我有一个分层树,其中包含一些与树相关的成员,例如ParentChildsAddNode()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() { }
}

我的具体方案的一些细节:

  1. 节点值类应该包含大约15个轻量级属性(它们是intbyteboolstring类型)和5-10种方法。< / LI>
  2. 截至目前,节点值不应与其树节点通信,因为结果不需要节点值交叉引用。但是,树节点对象将与节点值(在第二个设计中通过Value属性)对话。
  3. 我敢打赌这两种情况都是有效的(因为它们在很多文章中被广泛使用),所以问题是:

    1. 这些设计中的任何一种都是首选的吗?
    2. 如果不是,那么在选择之前我应该​​考虑哪些因素?

1 个答案:

答案 0 :(得分:4)

我会将这些担忧分开。树的关注点是维护修改后的树不变量。无论其关注点是什么,每个节点中数据的关注点都是如此。

我要做的是创建一个通用的容器类型Tree<T>并使树知道 nothing 关于它的值,并且值知道关于树的 nothing 他们在。

现在,在某些情况下,树必须知道关于值的某些内容。例如,假设您正在构建一个权重平衡的二叉树,而不是您在这里构建的n-ary树。权重平衡的二叉树必须能够查询节点以找出&#34; heavy&#34;他们要产生可接受的平衡。有几种方法可以做到这一点。一种方法是要求T实现一些IWeight接口。另一种方法是要求树的创建者提供Func<T, double>委托,该委托可以产生T的权重。无论哪种方式,树只需要知道节点,以便完成其工作:维护树不变量。