Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 树节点森林C++;?_C++_Tree_Nodes - Fatal编程技术网

C++ 树节点森林C++;?

C++ 树节点森林C++;?,c++,tree,nodes,C++,Tree,Nodes,嘿,我正在尝试创建树节点的“森林”。用户将输入两个林。。 例如, 森林1: a __b c 其中b是a的子树/节点。 森林2: d e __f __uug __h 其中d是父,e是f和h的父,f是g的父。f和h是兄弟姐妹 不管怎样,我有两个问题一直困扰着我: 逐行获取此输入(从unix系统?)的最佳方法是什么 为了得到父母和孩子,最好的方法是什么 任何其他提示也将不胜感激,谢谢 对于您所使用的系统类型来说,这并不重要,但是可以使用ifstream逐行处理。我不认为有什么“最好的方法”来遍历它,因

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

其中b是a的子树/节点。
森林2:
d
e
__f
__uug
__h

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

不管怎样,我有两个问题一直困扰着我:
逐行获取此输入(从unix系统?)的最佳方法是什么
为了得到父母和孩子,最好的方法是什么

任何其他提示也将不胜感激,谢谢

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

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

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


事实上,我有个更好的主意,但这至少会让你思考一下。干杯,让我知道你想到了什么

你可以一个字符一个字符地处理输入内容(我认为这样比较容易)

如果您的树不是二叉树(即,一个节点可以有两个子节点以上),那么引入一个“虚拟”父节点是值得的,该父节点将所有实际根作为其子节点。这将消除一些恼人的特殊情况(例如,forest为空),特别是在遍历中


最好添加一个从子级到父级的指针;如果希望在树中支持迭代器,这将非常有用。但是,如果在遍历过程中不需要执行复杂的操作,则可以递归地实现它,然后不需要任何子指针到父指针。

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

(a(b))(c)

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


我用图书馆做类似的用途。这是一个非常好的实现,但需要一定的时间来熟悉。

看起来不是树的最佳输入格式。@Joey这实际上是一个很好的表示问题的方法,只是对你自己进行分析会更加困难@9dan^但我猜这可能就是Boost.Graph的作用?