将C二进制搜索树保存到txt文件

时间:2016-12-21 00:59:08

标签: c text-files binary-tree binary-search-tree

我正在做一个C BST库,我试图做一个将二进制搜索树保存到文本文件中的函数。我对如何做到这一点很困惑。看看我的树结构:

struct Node {
    int value;
    struct Node *left;
    struct Node *right;
};

typedef struct Node TNode;
typedef struct Node *binary_tree;

创建树:

binary_tree NewBinaryTree(int value_root) {
    binary_tree newRoot = malloc(sizeof(TNode));
    if (newRoot) {
        newRoot->value = value_root;
        newRoot->left = NULL;
        newRoot->right = NULL;
    }
    return newRoot;
}

向其中添加元素:

void Insert(binary_tree *tree, int val) {
    if (*tree == NULL) {
        *tree = (binary_tree)malloc(sizeof(TNode));
        (*tree)->value = val;
        (*tree)->left = NULL;
        (*tree)->right = NULL;
    } else {
        if (val < (*tree)->value) {
            Insert(&(*tree)->left, val);
        } else {
            Insert(&(*tree)->right, val);
        }
    }
}

我开始使用该功能,但我不知道该怎么做:

void savetree(binary_tree *tree, char * filename)
{
FILE *afile;
int remainn, counter, readsize, i;
int *bb;

afile = fopen(filename, "wb");
if (afile) {
    bb = calloc(sizeof(int), BBSIZE);  //BBSIZE =4096
    remainn = treesize(tree);
    counter = 0;
    while (remainn > 0) {
        if (remainn > BBSIZE) {
            readsize = BBSIZE;
        } else {
            readsize = remainn;
        }

继承了树木化功能:

int treesize( binary_tree tree )
{
    if( tree == NULL )
    {
        return (0) ;
    }
    else
    {
        return( 1 + treesize( tree->left ) + treesize( tree->right ) ) ;
    }
}

此savetree功能尚未完成,但我不知道如何完成它/如果我所做的是正确的。

谢谢

3 个答案:

答案 0 :(得分:1)

嵌套括号和树是同一事物的替代表示。

所以写一棵树很容易

   void writenode(Node *node)
   {
      printf("{");
      printf("%d ", node-.value);
      if(node->left)
         writenode(node->left);
      if(node->right)
         writenode(node->right);
      printf("}");
    }

阅读相当困难。您必须检测格式错误的输入,并以递归方式构造子项。

答案 1 :(得分:0)

将二叉树保存到txt文件的最简单方法是将它们保存为数组。唯一的缺点是你会浪费空间,因为它会将二叉树保存为complete binary tree

易于编写甚至阅读。因为i索引处的左,右子节点和父节点可以找到:

int left(int i) {
    return 2*i + 1;
}
int right(int i) {
    return 2*i + 2;
}
int parent(int i) {
    return (i-1)/2;
}

enter image description here

答案 2 :(得分:0)

对于稀疏二叉树(具有罕见节点但高度非常高的二叉树),一种方法是保存其前序和后序遍历,然后从这两个遍历重建此二叉树,以避免按照Dulguun的建议保存许多NULL字节。

一些例子:Construct Full Binary Tree from given preorder and postorder traversals