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

📄 tree1.cpp

📁 顺序存储二叉树 程序有简单的二叉树的输入
💻 CPP
字号:
// 这是使用应用程序向导生成的 VC++ 
// 应用程序项目的主项目文件。

#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;



#include <iostream>
using namespace std;
#define True 1
#define False 0
#define Ok 1
#define Error 0
#define Overflow -2
#define Maxsize 100

typedef int TET;
typedef TET SqBT[Maxsize+1];

//使二叉树为空
void EmptyBT(SqBT bt)ni
{
	int i;
	for(i=1;i<=Maxsize;i++)
		bt[i]=0;
}


//插入一个元素的算法
void Insert(SqBT bt)
{
	int k;TET e;
A:
	cout<<"输入位置:";
	cin>>k;
	cout<<"输入元素:";
	cin>>e;
	cout<<endl;
	if(bt[k])                                               //判断k位置是否已经有元素
	{
		cout<<"你输入的位置"<<k<<"已经有元素,请重新输入!"<<endl;
		goto A;
	}
	else if(k<=Maxsize && bt[k/2])                    //k是否合法
		bt[k]=e;
	else 
	{
		cout<<"##ERROR  你输入的地址k<=Maxsize 或 bt[k/2]处没有子叶,请再次出入!!"<<endl;
	    goto A;
	}
}


**********************************************************************************
//建立二叉树
void CreateBT(SqBT bt)
{
	int n,i;
	cout<<"输入你要插入的个数:"<<endl;
	cin>>n;
	bt[0]=1;
//	cout<<"输入数据:"<<endl;
	for(i=1;i<=n;i++)
		Insert(bt);
}

**********************************************************************************
//前序遍历顺序二叉树算法
void PreBT(SqBT bt,int i)
{
   if(i>=Maxsize||!bt[i])
	   return;
   printf("%3d ",bt[i]);
   PreBT(bt,2*i);
   PreBT(bt,2*i+1);
}

**********************************************************************************
//中序打印二叉树的树形算法
void InBT(SqBT bt,int i,int k)
{ 
	int j;
    if(i>=Maxsize||!bt[i])
		return;
    InBT(bt,2*i+1,k+10);
    for(j=0;j<k;j++) 
		cout<<" ";

//		printf(" ");
    printf("%d\n",bt[i]);
    InBT(bt,2*i,k+10);
}
**********************************************************************************
//后序遍历顺序二叉树算法
void PostBT(SqBT bt,int i)
{
   if(i>=Maxsize||!bt[i])
	   return;
   PostBT(bt,2*i);
   PostBT(bt,2*i+1);
   printf("%3d ",bt[i]);
}

**********************************************************************************
//前序输出
void QianxuPrint(SqBT bt)
{
	int i;
	cout<<"输入你要从哪个节点开始输入起子叶:"<<endl;
	cin>>i;
	PreBT(bt, i);
}


**********************************************************************************
//中序输出
void ZhongxuPrint(SqBT bt)
{
	int i,k=1;
	cout<<"输入你要从哪个节点开始输入起子叶:"<<endl;
	cin>>i;
//	cout<<"输入k:"<<endl;
//	cin>>k;
	InBT(bt,i,k);
}
***********************************************************************************                                                                     
//后续输出
void HouxuPrint(SqBT bt)
{
	int i;
	cout<<"输入你要从哪个节点开始输入起子叶:"<<endl;
	cin>>i;
	PostBT(bt, i);
}

***********************************************************************************
void Change(SqBT bt)
{
	int k;TET e;
A:
	cout<<"输入改变的位置 和 元素:"<<endl;
	cin>>k>>e;
	if(k<=Maxsize && bt[k/2])
		bt[k]=e;
	else 
	{
		cout<<"##ERROR  请再次输入。"<<endl;
	    goto A;
	}
}

**********************************************************************************
//个数
int Menber(SqBT bt)
{
	int m=0,i=1;
	while(bt[i]!=0)
	{
		m++;
		i++;
	}
	return m;
}
//输出二叉树的子叶个数
int  Menprint(SqBT bt)
{
	cout<<"二叉树的子叶个数是:"<<Menber(bt)<<endl;
	return Ok;
}
***********************************************************************************
// 在完全二叉树的末尾插入元素
int Insertone(SqBT bt)                       //  与void Insert(SqBT bt)相似!!
{

	int k;TET e;
A:
	cout<<"请输入插入的位置k:";
	cin>>k;
	cout<<"请输入元素e:";
	cin>>e;
	cout<<endl;
	if(bt[k])                                               //判断k位置是否已经有元素
	{
		cout<<"你输入的位置"<<k<<"已经有元素,请重新输入!"<<endl;
		goto A;
	}
	else if(k<=Maxsize && bt[k/2])                    //k是否合法
	{
		bt[k]=e;
		return Ok;
	}
	else 
	{
		cout<<"##ERROR  你输入的地址k<=Maxsize 或 bt[k/2]处没有子叶,退出此操作!!"<<endl;
	    return Error;
	}
}
******************************************************************************
//判断形状和元素值完全相同
int EqualSq(SqBT bt, SqBT bt1)
{

	int n=0,m=0;
	n=Menber(bt);
	cout<<"*****二叉树A的元素个数为:"<<n<<endl
		<<"*****输入二叉树的 "<<n<<"个元素:"<<endl;
	bt1[0]=1;
	for(int j=1;j<=n;j++) 
		Insert(bt1);
	for(int i=1;i<Maxsize;i++)
	   if(bt[i]!=bt1[i]) 
	   {
		   m++;
		   cout<<"你输入的二叉树B与以前的二叉树不同!!"<<endl;
	   }
	if(m==0)
		cout<<"你输入的二叉树B与以前的二叉树相同!!!"<<endl;
	return Ok;
	
}
*****************************************************************************
//清空二叉树
int Clear(SqBT a,SqBT b)
{
	char c;
	int m,n;
	cout<<"清空二叉树a还是b:"<<endl;
	cin>>c;
	if(c=='a')
	{
		m=Menber(a);
		if(m==0)
		{
			cout<<"##二叉树a已经是空,退出此操作!!"<<endl;
			return Error;
		}
		else 
		{
			EmptyBT(a);
			cout<<"**二叉树b已经成功清空!!"<<endl;
		}
	}
	if(c=='b')
	{
		n=Menber(b);
		if(n==0)
		{
			cout<<"##二叉树b已经是空,退出此操作!!"<<endl;
			return Error;
		}
		else 
		{
			EmptyBT(b);
			cout<<"**二叉树a已经成功清空!!"<<endl;
		}
	}
	return Ok;
}


*********************************************************************
//求元素e在二叉树中层次
int FindNode(SqBT bt,int i,int e)//  made by 杨杨
{
	static k;  int k1;                     
    k++;
    if(i<Maxsize && bt[i] )
	{
		if(e==bt[i]) k1=k;
	    else if(!(k1=FindNode(bt,2*i,e))) 
			k1=FindNode(bt,2*i+1,e);    
	}
    else k1=0;
    k--;
    return k1;
}
//求元素e在二叉树中层次
int Search(SqBT bt)//  made by 杨杨
{
	int i,e,h;
	cout<<"输入你要查找的元素e:"<<endl;
	cin>>e;
	cout<<"输入你要从第几个子叶开始查找:"<<endl;
	cin>>i;
	h=FindNode(bt,i,e);
	if(h==0)
	{
		cout<<"二叉树中没有元素"<<e<<endl;
		return Error;
	}
	else
	{
		cout<<"二叉树中有元素"<<e<<endl;
		cout<<"且其在二叉树中层次是"<<h<<endl;
		return Ok;
	}
}
*****************************************************************
//求二叉树的深度//  made by 杨杨
int DepthBT(SqBT bt,int i)
{
	int k1,k2;
    if(i>=Maxsize||!bt[i]) return 0;
    k1=DepthBT(bt,2*i);
    k2=DepthBT(bt,2*i+1);
    return(1+((k1>=k2) ? k1 : k2));
 }
//求二叉树的深度
void Dep(SqBT bt)
{
	int i;
	cout<<"计算其子二叉树的层次,输入你要从哪个子叶开始i:"<<endl;
	cin>>i;
	cout<<"从第"<<i<<"子叶i="<<bt[i]<<"开始的子叶层次为:"<<DepthBT(bt,i)<<endl;
}

****************************************************************************









void windows()   //  made by 杨杨
{

	printf("\n             --------------------------------------------- \n");
	printf("             =                                              =\n");
	printf("             =     简单二叉树操作(5、6为两个二叉树的操作)   =\n");            
	printf("             =                                              =\n");
	printf("             ------------------------------------------------\n");
	printf("             =                                              =\n");
	printf("             =     1.  输入子叶元素                         =\n");
	printf("             =                                              =\n");
	printf("             =     2.  在树末尾插入元素                     =\n");
	printf("             =                                              =\n");
	printf("             =     3.  改变子叶的元素                       =\n");
	printf("             =                                              =\n");
	printf("             =     4.  输出子叶个数                         =\n");
	printf("             =                                              =\n");
	printf("             =     5.  判断二叉树的形状和元素值是否完全相同 =\n");
	printf("             =                                              =\n");
	printf("             =     6.  清空二叉树                           =\n");
	printf("             =                                              =\n");
	printf("             =     7.  求元素e在二叉树中层次                =\n");
	printf("             =                                              =\n");
	printf("             =     8.  求二叉树的深度                       =\n");
	printf("             =                                              =\n");
	printf("             =     9.  前序输出二叉树                       =\n");
	printf("             =                                              =\n");
	printf("             =     10. 中序输出二叉树                       =\n");
	printf("             =                                              =\n");
	printf("             =     11. 后序输出二叉树                       =\n");
	printf("             =                                              =\n");
	printf("             =     0.  退出单链表操作                       =\n");
	printf("             =                                              =");
	printf(" \n             ---------------------------------------------\n");
}

int main()
{
	int A[Maxsize+1],B[Maxsize+1];
    int choice;
	while(1)       //  进行一个操作后又回到窗口,  是用户选择下一操作!//  made by 杨杨
	{
		//system("cls");
		//  made by 杨杨
		windows();
		printf("           欢迎简单链表操作系统!!请输入您的选择 (0-8): ");
		cin>>choice;
		getchar();
		switch(choice)
		{
			case 1 : system("cls");   CreateBT(A);              break;
			case 2 : system("cls");   Insertone(A);             break;
			case 3 : system("cls");   Change(A);                break;
			case 4 : system("cls");   Menprint(A) ;             break;
			case 5 : system("cls");   Clear(A,B);               break;
			case 6 : system("cls");   Search(A);                break;
			case 7 : system("cls");   Dep(A) ;                  break;
			case 8 : system("cls");   EqualSq(A,B);             break;
			case 9 : system("cls");   QianxuPrint(A);           break;
			case 10 : system("cls");  ZhongxuPrint(A);          break;
			case 11 : system("cls");  HouxuPrint(A);            break;
			case 0 :                                            break;
			default:system("cls");printf("输入不正确! 请再次输入!!\n");
		}
		if(choice==0)
			break;
	}
	return 0;
}










⌨️ 快捷键说明

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