【问题标题】:should a tree have exactly one root node一棵树是否应该只有一个根节点
【发布时间】:2012-07-07 03:50:17
【问题描述】:

我想显示一个树形结构。我真的需要给用户/树一个预定义的硬编码根节点,比如“RootUnit”,他可以在其中添加他的孩子或后代吗?

这是否有意义或只会在添加节点时造成麻烦?

【问题讨论】:

  • 您应该添加一个与您正在使用的语言/框架相对应的标签...
  • 我只会使用一种语言:P
  • 如果问题是显示问题,那么它取决于你的节点是如何命名的。如果根有名称,那应该可以。如果您正在显示路径,例如“/Gramps/Dad/me”然后“/”可能是您家谱的显示根。旁白:我曾有过同时在两棵树中拥有一组节点的情况,例如可以通过姓名或地址遍历的联系人。
  • @Piskvor Borland Pascal 我 12 岁时做过 ;-) 我喜欢 C#。

标签: c# treeview hierarchy root-node


【解决方案1】:

这取决于上下文。从严格的数学定义来看,一棵树不能有多个根节点。但是,有些树的实现忽略了这一点并且无论如何都有多个顶级节点(例如您标记此问题的TreeView 控件)。您只需要问自己,如果您的特定程序使用多个顶级节点会更好或更差。鉴于我们对您的计划一无所知,因此我们无法真正为您做出决定。

【讨论】:

    【解决方案2】:

    根据定义,一棵树只有一个根,每个子节点都只有一个父节点(根没有父节点除外)。如果不满足这些限制,那么您的树将不再是树,而是图(定向与否)

    【讨论】:

      【解决方案3】:

      不要为每个节点使用相同的构造函数,而是提供一个用于根节点的默认构造函数和一个用于其他所有节点的构造函数。它并不难看,而且很有效。

      public Node()
      {
        // Set properties if you'd like.
        // such as having no children yet or whatnot.
      }
      
      public Node(Node parent)
      {
        // Similar to Node()
      }
      

      看!干净整洁。

      【讨论】:

      • 我从哪里知道何时调用重载的 Note 构造函数?不存在添加根节点按钮。那也没有任何意义。
      【解决方案4】:

      如果你有两个根,那么你就有两棵树。

      【讨论】:

      • 这不是我的问题的答案,而是关于树木的一般性陈述。
      • @Pascal - 你的问题是“一棵树是否应该只有一个根节点”,答案应该是“是”,但 Stackoverflow 不允许这么短的答案。我想你有一个更深层次的问题,但通读你的问题的其余部分,我仍然无法理解。
      • 看看我的问题的最后一部分:“......或者在添加节点时只会造成麻烦......”考虑到用户有一个 add_descendant 和 add_children 按钮,我想讨论这个场景。
      • 通过阅读stackoverflow.com/a/11366436/521554我相信我理解你的问题。我是否正确,它可能是“我必须创建一个根节点才能开始,还是可以检查用户第一次添加节点时是否创建了根节点?”唔。我的改写也不是很容易理解……我相信你必须让你的问题更清楚。
      • 我会用示例场景提出一个新问题。
      【解决方案5】:

      一棵树应该只有一个根。但是您不需要对根进行硬编码。只需将第一个创建的树节点视为根即可。

      【讨论】:

      • 然后我会在每次添加节点时检查 node.count == 0 或 nodes == Null 然后 newNode.parent = null。我不喜欢那样很麻烦。
      • 不是真的,你在创建根时就知道了。只需正常创建节点,当父节点为NULL时,您正在创建一个根。
      • 用户没有 AddRoot 按钮。只是一个添加节点按钮,所以我必须始终对现有节点等进行计数或父 == 空检查。
      • 检查根节点并不是那么麻烦恕我直言。您可以使用 myNode = otherNodePossiblyParentPossiblyRoot 之类的代码来做到这一点?新节点();
      猜你喜欢
      • 1970-01-01
      • 2021-12-20
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2022-06-22
      相关资源
      最近更新 更多