考虑一下我已经有一个函数调用int* binToArrayInOrder(TreeRoot* tr)
它创建一个排序的树值数组(因为它是有序的)。
无论如何从给定的数组中构造回树,而没有其他信息,例如前序数组中的相同树表示?
如何将数组写入 C 中的文本文件,请给我看代码。
考虑一下我已经有一个函数调用int* binToArrayInOrder(TreeRoot* tr)
它创建一个排序的树值数组(因为它是有序的)。
无论如何从给定的数组中构造回树,而没有其他信息,例如前序数组中的相同树表示?
如何将数组写入 C 中的文本文件,请给我看代码。
[1] 您可以再次将数组元素重新插入二叉树。但是,根据平衡算法,树可能看起来与您将它们提取到数组中时的样子并不完全相同。
[2] 这个怎么样?
void print_array (int *array, size_t sz, FILE *f) {
if (!sz) return;
fprintf(f, "%d\n", *array);
print_array(array+1, sz-1, f);
}
根据您的评论,您的实际问题是如何将二叉树保存到磁盘,然后将其恢复。这是一个数据结构序列化问题。对于这个问题,有序遍历可能不是您想要的。相反,序列化应该反映数据结构的布局方式。因此,您需要一个描述二进制节点的记录:
struct binary_node_file_data {
char data_[MAX_BINARY_NODE_DATA_SIZE];
int parent_;
};
现在,您可以执行二叉树的预遍历以填充您的节点。
struct binary_node_fila_data *bfd = malloc(sizeof(*bfd)*nodeCount);
int count = 0;
populate_binary_node_file(tree, bfd, &count, -1);
void populate_binary_node_file(binary_tree_t *tree,
struct binary_node_file_data *bfd,
int *count,
int parent) {
if (tree) {
int me = *count;
*count += 1;
export_binary_node_data(tree, &bfd[me], parent);
populate_binary_node_file(tree->left_subtree, bfd, count, me);
populate_binary_node_file(tree->right_subtree, bfd, count, me);
}
}
在这里,我希望-1
被视为NULL
指针。然后,将其转储bfd
到文件中。我将把恢复树作为练习。再考虑一下这个问题,遍历是前序还是有序(或后序)并不重要。恢复步骤只需要能够让所有孩子找到父母,以便他们可以正确填充左右指针。
对于第一个问题:不,节点的有序列表不允许您重建同一棵树。
例如,树
3
2
1
产生中序遍历 1 2 3
那个树
2
1 3
也产生 1 2 3。因此,您无法分辨使用哪棵树来产生给定的 1 2 3。
对于第二个问题:对不起,我还没有使用过 STL 文件 I/O。