实验六 树(二)

编写一个程序,实现二叉树的序列化和反序列化,完成以下功能:
(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;
	 
}

仅作留档。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值