您的位置:首页 > 理论基础 > 数据结构算法

[数据结构]二叉树自学

2015-06-20 23:36 495 查看
/*
Name:二叉树自学

Actor:HT

Time:2015年6月13日

Error Reporte:

1.sscanf(初始地址,"数据类型%d",接收地址);

}
*/

#include"stdio.h"
#include"conio.h"
#include"string.h"
#include"stdlib.h"
#include"iostream"
#include"windows.h"
#include"queue"

using namespace std;

struct treenode
{
int value;
treenode *left,*right;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
treenode* newnode()
{
treenode *tnode=(treenode *)malloc(sizeof(treenode));
if(tnode!=NULL)
{
tnode->value=0;
tnode->left=NULL;
tnode->right=NULL;
return tnode;
}
else
{
cout<<"false";
Sleep(3000);
exit(0);
}
}

void addnode(int val,char *s,treenode *& r)
{
int i;
treenode *temp=r;		//暂存根部
for(i=0;s[i]!='\0';i++)
{
if(s[i]=='l')
{
if(r->left==NULL) r->left=newnode();
r=r->left;
}
else if(s[i]=='r')
{
if(r->right==NULL) r->right=newnode();
r=r->right;
}
}
r->value=val;
r=temp;					//f找回根部
}

treenode *buildtree()
{
treenode *troot=newnode();
char s[15];
cout<<"Please input the tree in any order you want,just like this:"<<endl;
cout<<"5,r 9,l 32, 14,ll 4,lr 7,rl end\n"<<endl;
fflush(stdin);
while(scanf("%s",s)==1)
{									//cout<<s<<endl;
if(s[0]=='e') return troot;
int val;
sscanf(s,"%d",&val);			//cout<<val<<endl;
addnode(val,strchr(s,',')+1,troot);
}
return troot;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void pretree(treenode *r)
{
if (r==NULL) return;
cout<<r->value<<" ";
pretree(r->left);
pretree(r->right);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void deletetree(treenode *r)
{
if(r!=NULL)
{
deletetree(r->left);
deletetree(r->right);
free(r);
}
return;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void pip(char* s,char* s1,char* s2,int n)
{
if (n<=0) return;
int nleft=(strchr(s2,s1[0])-s2);		//cout<<nleft<<endl;		//精彩之处:字符串名字是指针,其差值就是字符个数!!
s[n-1]=s1[0];							//cout<<s[n-1]<<endl;
pip(s,s1+1,s2,nleft);
pip(s+nleft,s1+nleft+1,s2+nleft+1,n-1-nleft);
}

void prein_posttree(treenode *r)
{
int n;
char s[25],s1[25],s2[25];
cout<<"请输入先序字符串,如DBACEGF:\n";
cin>>s1;
cout<<"请输入中序字符串,如ABCDEFG:\n" ;
cin>>s2;
n=strlen(s1);							//cout<<n<<endl;
pip(s,s1,s2,n);
s
='\0';
cout<<s<<endl;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void BFS(treenode *r)
{
int i;
queue<treenode*> q;
q.push(r);
for(i=0;i<q.size();i++)
{
cout<<q.front()->value<<" ";
if(q.front()->left!=NULL) q.push(q.front()->left);
if(q.front()->right!=NULL) q.push(q.front()->right);
q.pop();
i--;
}
cout<<endl;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
int i=1;
treenode *root=NULL;
while(i)
{
system("cls");
cout<<"1 新建二叉树\n";
cout<<"2 在1的基础上先序遍历\n";
cout<<"3 给出先序中序,输出后序\n";
cout<<"4 在1的基础上BFS\n\n";
cin>>i;
if(i==1)
{
deletetree(root);
root=buildtree();
}
if(i==2)
{
pretree(root);
fflush(stdin);
getchar();
}
if(i==3)
{
prein_posttree(root);
fflush(stdin);
getchar();
}
if(i==4)
{
BFS(root);
fflush(stdin);
getchar();
}
}
deletetree(root);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: