二叉树的遍历比较常见,在遍历的时候把空节点也标识出来,即可构成一个序列,根据这个序列,同样可以恢复出二叉树结构。
以下程序以前序遍历的二叉树为例,可以用递归的方式去进行序列化,
恢复的时候,使用一个栈结构去处理,栈中的元素加个标记,标识已识别的子节点个数,个数为0时,新入栈的节点加到left,
个数为1时,新入栈的节点加到right,标识为2时,栈顶元素出栈,新节点入栈,如此循环,就可以恢复树结构了。
#include <stdio.h>
#include <stdlib.h>
struct Tree{
int val;
Tree* left;
Tree* right;
};
Tree list[300];
struct stack{
Tree* t;
int tag;
};
stack sk[300];
int slen = 0;
int num = 0;
void printTree(Tree* root)
{
if (root == 0)
{
printf("%d ", 50);
return;
}
printf("%d ", root->val);
printTree(root->left);
printTree(root->right);
}
void push(char c)
{
//50 means null node
if (c != 50)
{
list[num].val = c;
list[num].left = 0;
list[num].right = 0;
if (slen == 0)
{
sk[slen].t = &list[num];
sk[slen].tag = 0;
slen++;
num++;
return;
}
if (sk[slen-1].tag == 0)
{
sk[slen-1].t->left = &list[num];
}
else if (sk[slen-1].tag == 1)
{
sk[slen-1].t->right = &list[num];
}
sk[slen-1].tag++;
if (sk[slen-1].tag == 2)
{
slen--;
}
//add
sk[slen].t = &list[num];
sk[slen].tag = 0;
slen++;
num++;
}
else
{
if (sk[slen-1].tag == 0)
{
sk[slen-1].t->left = 0;
}
else if (sk[slen-1].tag == 1)
{
sk[slen-1].t->right = 0;
}
sk[slen-1].tag++;
if (sk[slen-1].tag == 2)
{
slen--;
}
}
}
Tree* deseq(char* buff)
{
num = 0;
int len = 0;
char c = buff[len];
while (c != 0)
{
push(c);
len++;
c = buff[len];
}
return &list[0];
}
int main()
{
// char buff[30] = {1, 50, 2, 50, 3, 50, 50, 0, 0};
char buff[30] = {1, 2, 3, 50, 2, 50, 3, 50, 50, 50, 50, 0, 0};
deseq(buff);
printTree(&list[0]);
return 0;
}