编写一个程序,实现二叉树的序列化和反序列化,完成以下功能:
(1) 创建二叉链b。
(2) 采用括号表示输出二叉链b。
(3) 对二叉链b进行先序遍历,产生先序序列化序列str。
(4) 输出先序序列化序列str。
(5) 由str构建二叉链b1(反序列化)。
(6) 采用括号表示输出二叉链b1。
(7) 销毁二叉链b和b1。
#include <iostream>
#include "stdio.h"
#include "malloc.h"
using namespace std;
typedef struct
{
char data[50];
int length;
}SqString;
void StrAssign(SqString &s,char cstr[])//生成串
{
int i;
for(i=0;cstr[i]!='\0';i++)
{
s.data[i]=cstr[i];
}
s.length=i;
}
void StrCopy(SqString &s,SqString t)//复制串
{
int i;
for(i=0;i<t.length;i++)
{
s.data[i]=t.data[i];
}
s.length=t.length;
}
bool StrEqual(SqString s,SqString t)//判断串相等
{
bool same=true;int i;
if(s.length!=t.length)
same=false;
else
for(i=0;i<s.length;i++)
{
if(s.data[i]!=t.data[i])
{
same=false;
break;
}
}
return same;
}
SqString Concat(SqString s,SqString t)//串的连接
{
SqString str;
int i;
str.length=s.length+t.length;
for(i=0;i<s.length;i++)
{
str.data[i]=s.data[i];
}
for(i=0;i<t.length;i++)
{
str.data[s.length+i]=t.data[i];
}
return str;
}
void DispStr(SqString s)//输出串
{
int i;
if(s.length>0)
{
for(i=0;i<s.length;i++)
{
cout<<s.data[i];
}
cout<<endl;
}
}
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
}BTNode;
void CreateBTree(BTNode *&b,char *str)//创建二叉树
{
BTNode *St[100],*p;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':top++;St[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:
p=(BTNode*)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
{
b=p;
}
else
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
void DestroyBTree(BTNode*&b)//销毁二叉树
{
if(b!=NULL)
{
DestroyBTree(b->lchild);
DestroyBTree(b->rchild);
free(b);
}
}
BTNode *FindNode(BTNode *b,char x)//查找结点
{
BTNode *p;
if(b==NULL) return NULL;
else if(b->data==x) return b;
else
{
p=FindNode(b->lchild,x);
if(p!=NULL) return p;
else return FindNode(b->rchild,x);
}
}
BTNode *LchildNode(BTNode *p)//找左孩子结点
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)//找右孩子结点
{
return p->rchild;
}
int BTHeight(BTNode *b)//求高度
{
int lchildh,rchildh;
if(b==NULL) return(0);
else
{
lchildh=BTHeight(b->lchild);
rchildh=BTHeight(b->rchild);
return(lchildh>rchildh)?(lchildh+1):(rchildh+1);
}
}
void DispBTree(BTNode *b)//输出二叉树
{
if(b!=NULL)
{
cout<<b->data;
if(b->lchild!=NULL || b->rchild!=NULL)
{
cout<<"(";
DispBTree(b->lchild);
if(b->rchild!=NULL) cout<<",";
DispBTree(b->rchild);
cout<<")";
}
}
}
int i=0;
SqString PreOrderSeq(BTNode*b)
{
SqString str,str1,leftstr,rightstr;
if(b==NULL)
{
StrAssign(str,"#");
return str;
}
str.data[0]=b->data;
str.length=1;
leftstr=PreOrderSeq(b->lchild);
str1=Concat(str,leftstr);
rightstr=PreOrderSeq(b->rchild);
str=Concat(str1,rightstr);
return str;
}
BTNode *CreatePreSeq(SqString str)
{
BTNode *b;
char value;
if(i>=str.length) return NULL;
value=str.data[i];i++;
if(value=='#') return NULL;
b=(BTNode*)malloc(sizeof(BTNode));
b->data=value;
b->lchild=CreatePreSeq(str);
b->rchild=CreatePreSeq(str);
return b;
}
int main()
{
BTNode *b,*b1;
SqString str;
CreateBTree(b,"A(B(D,E(,G)),C(,F(H,I)))");
cout<<"二叉树:";
DispBTree(b);
cout<<endl;
str=PreOrderSeq(b);
cout<<"先序序列化序列:";
DispStr(str);
b1=CreatePreSeq(str);
cout<<"由str构建二叉链:";
DispBTree(b1);
cout<<endl;
DestroyBTree(b);
DestroyBTree(b1);
return 1;
}
仅作留档。