在文件中表示二叉树所涉及的不同策略是什么,以便可以轻松地重新创建树结构?我正在使用C.
答案 0 :(得分:1)
将树的inorder和preorder遍历存储在文件中。任何二叉树都可以通过inorder和preorder遍历来重建[1]。
[1] http://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/
答案 1 :(得分:0)
这是一种天真的方式,假设你有类似的东西:
struct bst {
int val;
struct bst *left; // NULL when no node
struct bst *right;
}
制作另一个结构:
struct bst_serial {
int val;
int left; // NULL when no node
int right;
}
然后,malloc一个与你的树一样大的bst_serial
数组:
struct bst_serial *serial_bst = malloc(sizeof(struct bst_serial) * tree_size);
现在,像这样遍历树(未经测试):
int current_pos = 0;
int convert_node(bst *root) {
int this_pos = current_pos;
current_pos++;
serial_bst[this_pos].val = root->val;
if(root->left != NULL) {
serial_bst[this_pos].left = convert_node(root->left);
} else {
serial_bst[this_pos].left = -1;
}
if(root->right != NULL) {
serial_bst[this_pos].right = convert_node(root->right);
} else {
serial_bst[this_pos].right = -1;
}
return this_pos;
}
您现在可以将阵列write()
输出到磁盘。如果你编写函数来遍历bst_serial
类型的树,那么你甚至不需要对它进行反序列化 - 你可以只mmap()
它。对于额外的点,甚至不要首先使用指针树 - 在创建二叉树时创建和增长bst_serial
数组。那么你的代码不需要关心它是处理来自磁盘的树还是刚刚创建的树。
答案 2 :(得分:0)
您将需要至少2遍树,以便能够构建确切的树。因为一个给定的遍历可能有多个唯一树。
例如 - 您可以将二叉树的inorder和preorder遍历存储到文本文件中,并在重新创建树时按照以下链接从那里开始工作。
http://leetcode.com/2011/04/construct-binary-tree-from-inorder-and-preorder-postorder-traversal.html
答案 3 :(得分:-1)
执行有序遍历,并将节点的值写入使用新行分隔的文件。如果一个节点是叶子,则在叶子值之后存储一个特殊字符(例如#)。
当您阅读文件时,直到您没有获得'#'插入值,并向下移动到左侧。如果你在'#'上升,直到右边没有元素,然后下降到右边。递归地做这件事。