实现两个函数,分别用来序列化和反序列化二叉树。
有关二叉树的结点结构体定义如下:
typedef int DataType;
typedef struct BSTreeNode{
DataType data;
struct BSTreeNode *left;
struct BSTreeNode *right;
} BSTreeNode;
BSTreeNode *CreateNode(int data)
{
BSTreeNode *node = (BSTreeNode *)malloc(sizeof(BSTreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
二叉树的序列化从根结点开始,通过前序遍历将二叉树序列化为一个数组,当序列化二叉树遇到一个NULL指针时,将NULL指针序列化为-1。然后通过序列化数组反序列化构建二叉树。
序列化:
void serializeTree(BSTreeNode *root)
{
if (root == NULL) {
printf("%d ",-1);
return;
}
printf("%d ", root->data);
serializeTree(root->left);
serializeTree(root->right);
}
反序列化:
BSTreeNode *deserializationTree(int preOrder[], int size, int *pUsedSize)
{
if (size <= 0)
{
*pUsedSize = 0;
return NULL;
}
int leftUse, rightUse;
int rootValue = preOrder[0];
if (rootValue == -1)
{
*pUsedSize = 1;
return NULL;
}
BSTreeNode *root = CreateNode(rootValue);
root->left =deserializationTree(preOrder + 1, size - 1, &leftUse);
root->right = deserializationTree(preOrder + 1 + leftUse, size - 1 - leftUse, &rightUse);
//向老大报告实际使用情况
*pUsedSize = 1 + leftUse + rightUse;
return root;
}