[c++]代码库
#include<iostream.h>
#include<STRSTREAM.H>
typedef char elemtype;
struct btreenode
{
	elemtype data;
	btreenode *lchild;
	btreenode *rchild;
};
void initbtree ( btreenode *&bt )
{ bt=NULL;}
void precrttree ( btreenode *&bt )
{
	char ch;
	cin>>ch;
	if ( ch=='#' )
		bt=NULL;
	else
	{
		bt=new btreenode;
		bt->data=ch;
		precrttree ( bt->lchild );
		precrttree ( bt->rchild );
	}
}
void crtbtree ( btreenode *&bt,char *a )
{
	char ch;
	btreenode *s[20];
	int top=-1;
	bt=NULL;
	btreenode *p;
	int k;
	istrstream ins ( a );
	ins>>ch;
	while ( ch!='@' )
	{
		switch ( ch )
		{
		case'(':
			top++;
			s[top]=p;
			k=1;
			break;
		case')':
			top--;
			break;
		case',':
			k=2;
			break;
		default:
			p=new btreenode;
			p->data=ch;
			p->lchild=p->rchild=NULL;
			if ( bt==NULL )
				bt=p;
			else
			{
				if ( k==1 )  s[top]->lchild=p;
				else s[top]->rchild=p;
			}
		}
		ins>>ch;
	}
}
int btreeempty ( btreenode *bt )
{ return bt==NULL;}
void preorder ( btreenode *bt )
{
	if ( bt!=NULL )
	{
		cout<<bt->data<<' ';
		preorder ( bt->lchild );
		preorder ( bt->rchild );
	}
}
void inorder ( btreenode *bt )
{
	if ( bt!=NULL )
	{
		inorder ( bt->lchild );
		cout<<bt->data<<' ';
		inorder ( bt->rchild );
	}
}
void postorder ( btreenode *bt )
{
	if ( bt!=NULL )
	{
		postorder ( bt->lchild );
		postorder ( bt->rchild );
		cout<<bt->data<<' ';
	}
}
void levorder ( btreenode *bt )
{
	btreenode *q[30];
	int front=0,rear=0;
	btreenode *p;
	if ( bt!=NULL )
	{
		rear= ( rear+1 ) %30;
		q[rear]=bt;
	}
	while ( front!=rear )
	{
		front= ( front+1 ) %30;
		p=q[front];
		cout<<p->data<<' ';
		if ( p->lchild!=NULL )
		{
			rear= ( rear+1 ) %30;
			q[rear]=p->lchild;
		}
		if ( p->rchild!=NULL )
		{
			rear= ( rear+1 ) %30;
			q[rear]=p->rchild;
		}
	}
}
int btreedepth ( btreenode *bt )
{
	if ( bt==NULL )
		return 0;
	else
	{
		int dep1=btreedepth ( bt->lchild );
		int dep2=btreedepth ( bt->rchild );
		if ( dep1>dep2 )
			return dep1+1;
		else
			return dep2+1;
	}
}
int btreecount ( btreenode *bt )
{
	if ( bt==NULL )
		return 0;
	else
		return btreecount ( bt->lchild ) +btreecount ( bt->rchild ) +1;
}
int btreeleafcount ( btreenode *bt )
{
	if ( bt==NULL )
		return 0;
	else if ( bt->lchild==NULL&&bt->rchild==NULL )
		return 1;
	else return btreeleafcount ( bt->lchild ) +btreeleafcount ( bt->rchild );
}
void printbtree ( btreenode *bt )
{
	if ( bt==NULL )
		return;
	else
	{
		cout<<bt->data;
		if ( bt->lchild!=NULL||bt->rchild!=NULL )
		{
			cout<<'(';
			printbtree ( bt->lchild );
			if ( bt->rchild!=NULL )
				cout<<',';
			printbtree ( bt->rchild );
			cout<<')';
		}
	}
}
void clearbtree ( btreenode *&bt )
{
	if ( bt!=NULL )
	{
		clearbtree ( bt->lchild );
		clearbtree ( bt->rchild );
		delete bt;
		bt=NULL;
	}
}
void main()
{
	btreenode *bt;
	initbtree ( bt );
	char b[50];
	int tag;
	cout<<"1.pre order create btree"<<endl;
	cout<<"2.glist create btree"<<endl;
	cout<<"input selecte 1 or 2:";
	cin>>tag;
	if ( tag==2 )
	{
		cout<<"input @ end glist:"<<endl;
		cin.getline ( b,sizeof ( b ) );
		crtbtree ( bt,b );
	}
	else
	{
		cout<<"input pretree and '#':"<<endl;
		precrttree ( bt );
	}
	printbtree ( bt );
	cout<<endl;
	cout<<"pre order:";
	preorder ( bt );
	cout<<endl;
	cout<<"in order:";
	inorder ( bt );
	cout<<endl;
	cout<<"post order:";
	postorder ( bt );
	cout<<endl;
	cout<<"level order:";
	levorder ( bt );
	cout<<endl;
	cout<<"btree depth is:";
	cout<<btreedepth ( bt ) <<endl;
	cout<<"btree node num is:";
	cout<<btreecount ( bt ) <<endl;
	cout<<"btree leaf node num is:";
	cout<<btreeleafcount ( bt ) <<endl;
	clearbtree ( bt );
}
by: 发表于:2018-01-25 09:40:13 顶(0) | 踩(0) 回复
??
回复评论