如何将数组中的有序(LDR)二叉树转换回C+中的二叉树;使用文件

如何将数组中的有序(LDR)二叉树转换回C+中的二叉树;使用文件,c,text-files,binary-tree,C,Text Files,Binary Tree,假设我已经有了一个名为int*binToArrayInOrder(TreeRoot*tr)的函数,它创建了树值的排序数组(因为它是按顺序排列的) 是否仍然可以从顺序给定的数组中构造回树,而不使用其他信息,例如预顺序数组中的相同树表示 如何将数组写入C中的文本文件,请显示代码。[1]您可以再次将数组元素插入到二叉树中。不过,根据平衡算法的不同,树的外观可能与将它们提取到数组中时不同 [2] 这个怎么样 void print_array (int *array, size_t sz, FILE *f

假设我已经有了一个名为
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
转储到一个文件中。我将把修复这棵树作为练习。再仔细考虑一下这个问题,遍历是按顺序进行还是按顺序(或按顺序后)进行并不重要。恢复步骤只需要允许所有子级找到父级,以便它们可以正确填充左指针和右指针。

[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。

对于第一个问题:不,按顺序排列的节点列表不允许重建同一棵树

例如,树

  3
 2
1
生成顺序遍历1 2 3

 2
1 3
也产生1 2 3。因此,您无法判断哪棵树用于生成给定的1 2 3


对于第二个问题:对不起,我还没有使用STL文件I/O。

我认为可能有一个选项可以这样做,但我必须以某种方式标记数组中哪些单元格是叶子。但我还不确定。我可以通过改变treeNode的数据结构,让它有一个布尔标志isLeafI,我想也许有一个选项可以这样做,但我必须以某种方式标记数组中哪些单元格是叶子。但我还不确定。我可以通过改变treeNode的数据结构,使其具有一个布尔标志isLeafokay来实现这一点,但是您是否看到了在不使用另一个预排序或后排序数组作为对algorithm@JavaSa为什么你需要同一棵树?因为我想把树存到一个文件中,我将把它转换为一个值数组,并将其写入一个文件。现在我想再次加载它,所以它必须是same@JavaSa:如果确实需要,可以将树写入文件。但是从语义上讲,从数组中重新构建一棵新树也同样好。保存树会使恢复树更快,但代价是将更多信息保存到磁盘。@JavaSa:感谢您接受我的回答,对你的问题+1。好的,但是你看到没有其他预订单或后订单数组作为额外输入到algorithm@JavaSa为什么你需要同一棵树?因为我想把树存到一个文件中,我会把它转换成一个数组的值并把它写到一个文件中。现在我想再次加载它,所以它必须是same@JavaSa:如果确实需要,可以将树写入文件。但是从语义上讲,从数组中重新构建一棵新树也同样好。保存该树将使恢复该树更快,但代价是将更多信息保存到磁盘。@JavaSa:感谢您接受我的回答,+1回答您的问题。