【问题标题】:Building an incomplete binary tree构建不完全二叉树
【发布时间】: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


【解决方案1】:

像二维数组,array[row][column],你可以使用2D vector,即。 vector< vector<int> > V 是向量的向量。

vector< vector<int> > V中,内向量表示行,外向量表示列(for your understanding I just tell)

这里的二维向量是可以调整大小的。不必每列大小都相等。你可以处理push, pop,你可以根据你的内存大小存储数据。

例子:

你可以像这样调整大小:

int num_of_col = 5;
int num_of_row = 9;
double init_value = 3.14;

vector< vector<double> > matrix;
//now we have an empty 2D-matrix of size (0,0). Resizing it with one single command:
matrix.resize( num_of col , vector<double>( num_of_row , init_value ) );
// and we are good to go ... 

你可以在这里学习vector

【讨论】:

    【解决方案2】:

    为什么不使用 std::vector 而不是数组?它的行为与数组完全一样,但可以调整大小。

    使用示例:

    using namespace std;
    Node *a = new Node;
    vector<Node*> vec;
    vec.push_back(a);
    

    【讨论】:

    • 因为当向量增长时,它可能会在内存中移动,从而使现有指针失效。
    • 在内存中移动的向量如何使现有指针失效?你能解释一下吗?
    • 因为向量中节点之间的指针将不再指向同一个节点。
    • 所以你基本上是说存储在向量中的 Node* 对象的值会在每次向量改变其大小时改变?如果是这样,那么我非常不同意
    • 当向量展开时,Nodes 持有的Node*s 将不再指向分配的内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多