【问题标题】:Forest of tree nodes C++?树节点森林C ++?
【发布时间】:2011-07-26 08:44:09
【问题描述】:

嘿,我正在尝试创建树节点的“森林”。用户将输入两个森林.. 例如,
森林1:
一个
_ _b
c

其中 b 是 a 的子树/节点。
森林2:
d
电子
_ _f
_ _ _ _g
_ _h

其中 d 是父级,e 是 f 和 h 的父级,f 是 g 的父级。 f 和 h 是兄弟姐妹。

无论如何,我有两个问题一直困扰着我:
逐行获取此输入(来自unix系统?)的最佳方法是什么?
而且,为了得到父母和孩子,最好的方法是什么。
任何其他提示也很感激,谢谢!

【问题讨论】:

  • 看起来不像是树的最佳输入格式。

标签: c++ tree nodes


【解决方案1】:

您可以使用类似 Lisp 的语法进行输入:

(a (b)) (c)

(d)(e(f(g))(h))

我出于类似目的使用了Boost.Graph 库。这是一个非常好的实现,但需要一点时间来熟悉。

【讨论】:

  • @Joey 这实际上是表示您的问题的好方法,但您自己解析会更棘手。 @9dan ^但我猜这可能就是 Boost.Graph 的用途?
【解决方案2】:

您使用的系统类型并不重要,但是可以,使用 ifstream 逐行处理它。我不认为真的没有“最好的方法”来遍历它,因为它是一个文本文件,有人可以向你传递一个以任何奇怪方式格式化的 txt 文件;所以你应该考虑到这一点,并尽可能地处理所有情况。

那么,让我们尝试逐步了解如何做到这一点。

您正在逐行处理此循环,您的当前节点设置为 NULL,因为尚未处理父节点。读入该行并在字符串的开头查找下划线;如果 parent 为空,那么我们有一行无法处理,所以跳过它。如果第一个字符不是下划线,则将其设置为当前父节点并继续循环的下一部分。如果有下划线且当前父节点不为空,则遍历剩余的下划线数量并向下遍历父节点内部节点的子节点。

实际上,我只是有了一个更好的主意,但这至少会让你有所思考。干杯,让我知道你想出什么。

【讨论】:

    【解决方案3】:

    您可以逐个字符处理输入的字符(我认为这样会更容易一些)。

    如果您的树不是二元树(即,一个节点可以有超过 2 个子节点),则可能值得引入一个“虚拟”父节点,该节点将所有真实根作为其子节点。这将消除一些烦人的特殊情况(例如森林为空),尤其是在遍历时。

    添加一个从子级到父级的指针可能会更好;如果您想在树中支持迭代器,这将很有用。但是,如果在遍历过程中不需要做复杂的事情,可以递归实现,这样就不需要任何子到父的指针了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 2020-02-08
      相关资源
      最近更新 更多