树节点是否应该有一个指向其包含树的指针?

时间:2009-07-07 16:05:53

标签: c# data-structures tree

我正在构建一个具有基于树的数据模型的gui组件(例如文件系统中的文件夹结构)。所以gui组件基本上有一个树集合,它们只是具有键的Node对象,引用gui组件的一部分(因此你可以为Node对象分配值,然后又更新gui),以及节点儿童的集合。

我想做的一件事是能够设置适用于每个节点级别的“样式”(例如,所有顶级节点都是粗体,所有2级节点都是斜体等)。所以我把它添加到gui组件对象。要添加节点,请在Node对象上调用AddChild。我想在这里应用这个样式,因为在添加节点时我知道节点的级别。

问题是,样式信息只在包含对象(gui对象)中,因此Node不知道它。我可以在每个节点中向gui对象添加一个“指针”,但这似乎有点错误......或者我可以隐藏节点并使用户只能通过gui对象添加节点,例如gui.AddNode(节点new_node,节点父节点),看起来不太优雅。

是否有一个更好的设计,我错过了,或者我提到的几种方式并不是那么糟糕?

3 个答案:

答案 0 :(得分:3)

向每个节点添加ParentNode属性“并不是那么糟糕”。事实上,它很常见。显然你没有添加该属性,因为你最初不需要它。现在你需要它,所以你有充分的理由添加它。

替代人员包括:

  • 编写一个函数来查找处理器密集型子级的父级。
  • 添加一个单独的类,它会缓存父子关系,这会浪费精力和内存。

基本上,将一个指针添加到现有类中是一种选择,可以使用内存来缓存父值,而不是使用处理器时间来查找它。在这种情况下,这似乎是一个不错的选择。

答案 1 :(得分:2)

在我看来,您唯一需要的是节点上的Level属性,并在通过GUI对象渲染节点时使用它。

但重要的是,你的Tree元素是否与XmlNode一样是表示不可知的,或者像Windows.Forms.TreeNode那样面向GUI。后者有一个TreeView属性,没有任何问题。

答案 2 :(得分:1)

我认为没有理由不在节点中引用GUI对象。节点不能存在于GUI对象之外,并且能够轻松找到包含节点的GUI对象非常有用。

如果您的叶节点可能处于不同的级别,您可能不希望将格式绑定到节点所在的级别。