我正在做一个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功能尚未完成,但我不知道如何完成它/如果我所做的是正确的。
谢谢
答案 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;
}
答案 2 :(得分:0)
对于稀疏二叉树(具有罕见节点但高度非常高的二叉树),一种方法是保存其前序和后序遍历,然后从这两个遍历重建此二叉树,以避免按照Dulguun的建议保存许多NULL字节。
一些例子:Construct Full Binary Tree from given preorder and postorder traversals