树节点森林C ++?
Posted
技术标签:
【中文标题】树节点森林C ++?【英文标题】:Forest of tree nodes 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系统?)的最佳方法是什么? 而且,为了得到父母和孩子,最好的方法是什么。 任何其他提示也很感激,谢谢!
【问题讨论】:
看起来不像是树的最佳输入格式。 【参考方案1】:您可以使用类似 Lisp 的语法进行输入:
(a (b)) (c)
(d)(e(f(g))(h))
我出于类似目的使用了Boost.Graph 库。这是一个非常好的实现,但需要一点时间来熟悉。
【讨论】:
@Joey 这实际上是表示您的问题的好方法,但您自己解析会更棘手。 @9dan ^但我猜这可能就是 Boost.Graph 的用途?【参考方案2】:您使用的系统类型并不重要,但是可以,使用 ifstream 逐行处理它。我不认为真的没有“最好的方法”来遍历它,因为它是一个文本文件,有人可以向你传递一个以任何奇怪方式格式化的 txt 文件;所以你应该考虑到这一点,并尽可能地处理所有情况。
那么,让我们尝试逐步了解如何做到这一点。
您正在逐行处理此循环,您的当前节点设置为 NULL,因为尚未处理父节点。读入该行并在字符串的开头查找下划线;如果 parent 为空,那么我们有一行无法处理,所以跳过它。如果第一个字符不是下划线,则将其设置为当前父节点并继续循环的下一部分。如果有下划线且当前父节点不为空,则遍历剩余的下划线数量并向下遍历父节点内部节点的子节点。
实际上,我只是有了一个更好的主意,但这至少会让你有所思考。干杯,让我知道你想出什么。
【讨论】:
【参考方案3】:您可以逐个字符处理输入的字符(我认为这样会更容易一些)。
如果您的树不是二元树(即,一个节点可以有超过 2 个子节点),则可能值得引入一个“虚拟”父节点,该节点将所有真实根作为其子节点。这将消除一些烦人的特殊情况(例如森林为空),尤其是在遍历时。
添加一个从子级到父级的指针可能会更好;如果您想在树中支持迭代器,这将很有用。但是,如果在遍历过程中不需要做复杂的事情,可以递归实现,这样就不需要任何子到父的指针了。
【讨论】:
以上是关于树节点森林C ++?的主要内容,如果未能解决你的问题,请参考以下文章