在文件中表示二叉树

时间:2012-01-10 10:38:30

标签: algorithm file data-structures tree

在文件中表示二叉树所涉及的不同策略是什么,以便可以轻松地重新创建树结构?我正在使用C.

4 个答案:

答案 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)

执行有序遍历,并将节点的值写入使用新行分隔的文件。如果一个节点是叶子,则在叶子值之后存储一个特殊字符(例如#)。

当您阅读文件时,直到您没有获得'#'插入值,并向下移动到左侧。如果你在'#'上升,直到右边没有元素,然后下降到右边。递归地做这件事。