⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twotree.cpp

📁 二叉树的基本操作
💻 CPP
字号:
#include<iostream.h>

struct BiTree
{	
	int data;
	BiTree*Lchild,*Rchild;	
	BiTree()
	{
		data=0;
		Lchild=0;
		Rchild=0;
	}
	~BiTree()
	{
		delete Lchild;
		delete Rchild;
	}
	
};
typedef BiTree*BTree;

void Insert(BTree&T,int Data);//向二叉树中插入结点
void Creat(BTree&T);//建立排序二叉树
int Find(BTree&T,BTree&f,BTree&p,int Data);//查找结点
int  Delete(BTree&T,int Data);//删除结点
void Delete_One(BTree&p);
void DLR_OutPut(BTree&T);//先根序遍历二叉树
void LDR_OutPut(BTree&T);//中根序遍历二叉树
void LRD_OutPut(BTree&T);//后根序遍历二叉树

void Insert(BTree&T,int Data)
{
	BTree s;	
	s=new BiTree;
	s->data=Data;	
	s->Lchild=0;
	s->Rchild=0;
	if(T==0)T=s;	
	else if(s->data<T->data)Insert(T->Lchild,Data);
	else if(s->data>T->data)Insert(T->Rchild,Data);	
}

void Creat(BTree &T)	
{	
	if(T)T=0;//T=0便于重新建二叉树
	int x;		
	cin>>x;
	while(x!=-1)
	{		
		Insert(T,x);
		cin>>x;
	}
}

int Find(BTree &T,BTree&f,BTree &p,int Data)
{

	if(T==0)
	{		
		//cout<<"树空!"<<endl;		
		p=f;
		return 0;
	}
	else 
		if(Data==T->data)	
		{		
			p=T;
			return 1;
		//	cout<<"查找成功!"<<endl;			
		}	
		else 
			if(Data<T->data)
				Find(T->Lchild,T,p,Data);	
			else 
				if(Data>T->data)Find(T->Rchild,T,p,Data);	
}

int Delete(BTree &T,int data)
{
	if(T==0)return 0;
	else
	{
		if(T->data==data)
		{
			Delete_One(T);
			return 1;
		}
		else if(data<T->data)Delete(T->Lchild,data);	
		else if(data>T->data)Delete(T->Rchild,data);
	}
}

void Delete_One(BTree &p)//画图分析呀!!!!!!!!!!!!!!!
{
	BTree p1, p2;
	if(p->Rchild==0)
	{
		p1=p;
		p=p->Lchild;
		delete p1;
	}
	else if(p->Lchild==0)
	{
		p1=p;
		p=p->Rchild;
		delete p1;
	}
	else
	{
		p1=p;
		p2=p->Lchild;
		while(p2->Rchild)
		{
			p1=p2;
			p2=p2->Rchild;
		}
		p->data=p2->data;
		if(p1!=p)p1->Rchild=p2->Lchild;
		else p1->Lchild=p2->Lchild;
		delete p2;
	}
}

void DLR_OutPut(BTree &T)
{
	if(T==0);//cout<<"树空!";
	else 
	{	
		cout<<T->data<<'\t';
		DLR_OutPut(T->Lchild);			
		DLR_OutPut(T->Rchild);
	}
}

void LDR_OutPut(BTree &T)
{
	if(T==0);//cout<<"树空!";
	else 
	{	
		LDR_OutPut(T->Lchild);
		cout<<T->data<<'\t';	
		LDR_OutPut(T->Rchild);
	}
}

void LRD_OutPut(BTree &T)
{
	if(T==0);//cout<<"树空!";
	else 
	{	
		LRD_OutPut(T->Lchild);
		LRD_OutPut(T->Rchild);		
		cout<<T->data<<'\t';		
	}
}

void main()
{
	BTree T;
Labl_6:
	{	
		cout<<"请输入二叉树的结点值,以-1结束!"<<endl;	
		Creat(T);
	}	
Labl:
	{
		int m;
		cout<<endl;
		cout<<"排序二叉树已经建好,请选择操作:"<<endl;
		cout<<"***************************************************************"<<endl<<endl;
		cout<<"          1: 先序遍历二叉树  2:中序遍历二叉树"<<endl;
		cout<<"          3: 后序遍历二叉树  4:向二叉树插入数值"<<endl;
		cout<<"          5: 查找一个结点    6:重新建立二叉树 "<<endl;
		cout<<"          7: 删除一个结点    8:退出程序"<<endl;
		cout<<"***************************************************************"<<endl<<endl;
		cin>>m;
		switch(m)
		{
		case 1 : goto Labl_1;break;		
		case 2 : goto Labl_2;break;		
		case 3 : goto Labl_3;break;
		case 4 : goto Labl_4;break;
		case 5 : goto Labl_5;break;
		case 6 : goto Labl_6;break;
		case 7 : goto Labl_7;break;
		case 8 : goto Labl_8;break;
		default: goto Labl;
		}	
	}
Labl_1:
	{	cout<<"先序遍历结果为:"<<endl;	   
		DLR_OutPut(T);
		cout<<endl;
		goto Labl;
	}
Labl_2:
	{
		cout<<"中序遍历结果为:"<<endl;
		LDR_OutPut(T);
		cout<<endl;
		goto Labl;
	}
Labl_3:
	{
		cout<<"后序遍历结果为:"<<endl;
		LRD_OutPut(T);
		cout<<endl;
		goto Labl;
	}
Labl_4:
	   {
		   cout<<"请输入要插入的值:"<<endl;
		   int v;
		   cin>>v;
		   Insert(T,v);
Labl_4_1:{	   
			 cout<<"继续插入 Y/N?"<<endl;		   
			 char flag;		   
			 cin>>flag;		   
			 switch(flag)		   
			 {		   
			 case 'Y':		   
			 case 'y':goto Labl_4;break;		   
			 case 'N':		   
			 case 'n':goto Labl;break;	   
			 default :goto Labl_4_1;		   
			 }
		 }//Labl_4_1
	   }//Labl_4
Labl_5:
	   { 
		   cout<<"请输入要查找的值:"<<endl;
		   BTree f=0,p=0;
		   int v;
		   cin>>v;
		   if(Find(T,f,p,v))cout<<"查找成功,其地址是:"<<p<<endl;
		   else cout<<"查找失败!"<<endl;
Labl_5_1:
		   { 
			 cout<<"继续查找 Y/N?"<<endl;		   
			 char flag;		   
			 cin>>flag;		   
			 switch(flag)		 
			 {		   
			 case 'Y':		   
			 case 'y':goto Labl_5;break;		   
			 case 'N':		   
			 case 'n':goto Labl;break;		   
			 default :goto Labl_5_1;		   
			 }		 
		   }//Labl_5_1
	   }//Labl_5
Labl_7:
	   {
		   cout<<"请输入要删除的值:"<<endl;
		   int v;
		   cin>>v;		   
		   if(Delete(T,v))cout<<"删除成功!"<<endl;
		   else cout<<"删除失败!"<<endl;
Labl_7_1:{
			 cout<<"继续删除 Y/N?"<<endl;		   
			 char flag;		   
			 cin>>flag;		   
			 switch(flag)		   
			 {			   
			 case 'Y':		   
			 case 'y':goto Labl_7;break;		   
			 case 'N':		   
			 case 'n':goto Labl;break;		   
			 default :goto Labl_7_1;
			 }
		 }//Labl_7_1
	   }//Labl_7
Labl_8:;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -