【发布时间】:2015-09-09 05:47:18
【问题描述】:
我正在尝试根据文本文件中提供的数据构建不完整的二叉树
2
3 8
2 10 0 12
1 8 0 0 4 0
这会形成这样一棵树:
我大概知道我需要做什么,我想:
- 从文件中逐行读取。
- 将数组传递给构建函数。
- 在构建树时,树数据类型将跟踪它在指针数组中添加的最后一个节点(例如,如果我们刚刚添加完文本文件的第 3 行,之前的节点数组将看起来像指向包含
[2 10 12]的节点的指针 - 当我们开始添加第 4 行时,我们会创建一个长度为 3*2=6 的数组来存储指向我们添加节点的指针。
- 我们遍历上次运行的指针数组(包含
[2 10 12]),并为通过的任何非零键创建左右子节点。我们将指向这些节点的指针放入 6 长数组中。 - 当我们得到一个空行时,我们就完成了。
我遇到的问题是,我不确定如何存储指向每次调用构建函数时都会改变大小的节点的指针数组,并且是一个类变量(对于 Tree 类)。我会以正确的方式解决这个问题吗?有没有更简单的方法来解决这个问题?
【问题讨论】:
-
效率是否值得关注?除非您想提高效率,否则您当然不需要指针数组。您可以只使用它所在行中每个整数的位置来告诉您在哪里添加该整数。
-
另一种方法是从叶子向上(而不是从根向下)构建树,这需要在开始构建树之前读取整个文件,但这非常简单。跨度>
-
不,我不担心效率。如果文本文件中的信息描述了一个完整的树(即如果第 n 行有 2^n 个值),那么我可以只使用位置来知道将值放在哪里。但是,文本文件的每一行仅在前一行的节点不为空时才包含信息,因此使用位置来判断哪个应该是父节点并不是那么容易。
-
当它是不完整的树时,我没有看到问题所在。我假设只有最后一行是不完整的(就像你的例子),你确定不是这样吗?
-
但是即使每一行都可能不完整,那么您必须假设只会创建最左边的节点(否则问题不明确)所以我仍然没有看到问题。
标签: c++ data-structures binary-tree